Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Vurkolak en 2 Julio 2020, 01:51 am



Título: Ayuda Run-time Failure stack around the variable ping was corrupted
Publicado por: Vurkolak en 2 Julio 2020, 01:51 am
Muy buenas, tengo que realizar un ejercicio que me dice que tengo que leer una ruta de un fichero introducido por teclado para ver su contenido,el contenido trata de ips (esto ya esta realizado y funciona) luego me pide que ejecute un ping de las ips leidas y aquí al final es donde tengo el run-time evidentemente hay algo que no hago bien y se descontrola pero no soy capaz de resolver el error. Espero que alguien me pueda ayudar y así poder aprender de estos errores. Muchas gracias.

Código
  1. void leerFichero() {
  2. #define SIZE_IP 15
  3. char nombreFichero[256]; //declaramos una array de char para poder introducir la ruta con un máximo de 256 carcateres
  4. char caracter; // declaramos caracter para recoger caracter a caracter
  5. char ip[SIZE_IP]; // declaramos un array de 15 ya que el maximo de una ip es 255.255.255.255
  6. char ping[] = "ping";
  7. //int final = 0;
  8. FILE* miFichero; // declaramos el file como miFichero
  9.  
  10. printf("Escriba la ruta del fichero a visualizar: \n");
  11.  
  12. scanf("%s",&nombreFichero); // recogemos la ruta del archivo donde se abrirá
  13. miFichero = fopen(nombreFichero,"r"); //abrimos el fichero en modo lectura "r"
  14. if (miFichero == NULL) { // si el fichero no existe printamos un error
  15. printf("Error al abrir el fichero\n");
  16. }
  17. else
  18. {
  19. printf("\n**************************Lectura del fichero****************************\n\n"); //printamos el contenido del fichero
  20. caracter = fgetc(miFichero); //recoge caracter a caracter y lo almacena en caracter
  21. while (feof(miFichero)==0) // mientras no llegue al final del archivo printará por consola el contenido del fichero
  22. {
  23. printf("%c", caracter);
  24. caracter = fgetc(miFichero);
  25. }
  26. rewind(miFichero);
  27. printf("\n**************************Lectura de las IPs****************************\n\n");
  28.  
  29. //final=fscanf(miFichero, "%s", ip);
  30.  
  31. while (!feof(miFichero))
  32. {
  33. fgets(ip, SIZE_IP, miFichero);
  34.  
  35. //fscanf(miFichero, "%s", ip);
  36. //printf("variable ping: %s variable ip: %s", ping, ip);
  37. strcpy(ping, "ping ");
  38. system(strcat(ping, ip));
  39. }
  40. fclose(miFichero); //cerramos el fichero
  41. }
  42. fflush(stdin); //borramos la memoria
  43. //printf("Presione enter para salir \n");
  44. // getchar();
  45. }

MOD: Corregidas las etiquetas de Código GeSHi


Título: Re: Ayuda Run-time Failure stack around the variable ping was corrupted
Publicado por: K-YreX en 2 Julio 2020, 04:01 am
El problema más gordo está en la línea 38. No puedes pasar la cadena concatenada sin antes guardarla en una variable. Es por esto que se corrompe la pila y te sale ese error.

Además de eso, cuidado con la longitud para la IP. Utilizas una longitud de 15 porque la ip más larga es de 15 caracteres pero no estás teniendo en cuenta el caracter de fin de cadena ('\0'). Cuando utilizas fgets() e indicas SIZE_IP, la función guarda hasta un máximo de (SIZE_IP - 1) caracteres; puesto que el último lo reserva para el de fin de cadena.

Y para las cadenas evita usar scanf(), fscanf() y similares. Es preferible usar siempre fgets(). Además fflush(stdin) no es la manera correcta de limpiar el buffer de entrada. Esa función solo está definida para limpiar el de salida (fflush(stdout)).

Te dejo una variante que funciona (está probada en Linux):
Código
  1. printf("Introduce el nombre del fichero con las direcciones IP: ");
  2. fgets(file_name, SIZE_NAME, stdin);
  3.        // Eliminar el salto de linea del final y limpiar el buffer de entrada
  4. if(file_name[strlen(file_name)-1] == '\n') file_name[strlen(file_name)-1] = '\0';
  5. else while(getchar() != '\n');
  6.  
  7. file = fopen(file_name, "r");
  8.  
  9. while(fgets(ip, SIZE_IP, file)){
  10. printf("IP address to ping: %s", ip);
  11. strcpy(command, "ping -c 4 ");
  12. strcat(command, ip);
  13. system(command);
  14. }




Título: Re: Ayuda Run-time Failure stack around the variable ping was corrupted
Publicado por: Vurkolak en 2 Julio 2020, 15:35 pm
Hola YreX-DwX ante todo muchas gracias por invertir parte de tu tiempo para que los demás también podemos ir aprendiendo, he aplicado la parte de lectura con el código de ejemplo pero antes de llegar allí como bien dices no contempló el fin de cadena de la IP \0 y le añadido uno más para que pueda obtenerlo,  luego si te fijas char ping[] = "ping"; no le pongo cuántos caracteres va a recoger ese array pues luego ese array deberá concatenar con IP con strcat ahora he probado char ping[21] = "ping"; los 5 de ping + los 16 de IP y funciona no sé si es la mejor forma de solucionar el problema pero de esta funciona, rectificame en cualquier cosa lo importante es aprender, gracias


Título: Re: Ayuda Run-time Failure stack around the variable ping was corrupted
Publicado por: K-YreX en 4 Julio 2020, 20:33 pm
La solución que busques dependerá un poco de las necesidades de tu programa.

Si por ejemplo, es un programa que estás haciendo para aprender a manejar cadenas o para hacer llamadas al sistema, lo más seguro es que no compense centrar tus esfuerzos en la longitud exacta de las cadenas. Es por esto que normalmente se emplean cadenas char estáticas con tamaños superiores a los necesarios (siempre que la cantidad de memoria no sea un problema).

Si quieres hacerlo con más precisión podrías utilizar memoria dinámica para que cada cadena tenga el largo justo y necesario o utilizar la función strlen() para obtener el largo de una cadena y realizar las cuentas necesarias para calcular de antemano la longitud que necesitas.