c gcc header warnings gets

Deshabilitar mensajes de advertencia en GCC a través de archivos de encabezado?



header warnings (8)

Estoy usando la función gets() en mi código C. Mi código funciona bien pero recibo un mensaje de advertencia

(.text+0xe6): warning: the `gets'' function is dangerous and should not be used.

Quiero que este mensaje de advertencia no aparezca. ¿Hay alguna manera?

Me pregunto si podría haber tales posibilidades al crear un archivo de cabecera para deshabilitar algunas advertencias. ¿O hay alguna opción durante la compilación que pueda servir para mi propósito? ¿O puede haber una forma particular de usar gets() para que esta advertencia no aparezca?


No debe usar la función get en absoluto, la página de manual dice que use fgets lugar.

GCC no proporciona la funcionalidad que GCC hace para desactivar advertencias usando pragmas. En su lugar, debe usar las diversas opciones de advertencia como indicadores para el compilador.


Prestaré atención a la advertencia y reemplazaré. Esto es lo suficientemente claro para mí:

LOCO

Nunca use get (). Debido a que es imposible decir sin conocer los datos de antemano cuántos caracteres obtiene () leerá, y porque get () continuará almacenando caracteres más allá del final del búfer, es extremadamente peligroso de usar. Se ha utilizado para romper la seguridad informática. Use fgets () en su lugar.


Realmente no hay una buena razón para usar gets() . ¡Incluso el estándar C dice que es obsoleto! Use fgets() lugar.

[Editar]

Parece que la advertencia proviene del enlazador. ¿Recibes una advertencia cuando compilas con -c ? (Lo cual deshabilita el enlace)


Si realmente quieres usarlo.

Aquí hay una respuesta de: http://www.gamedev.net/community/forums/topic.asp?topic_id=523641

Si usa una versión razonablemente reciente de gcc, puede usar:

#pragma GCC diagnostic ignored "your option here"

Por ejemplo, si esos encabezados producen un error de "coma flotante no es seguro", usted usaría:

#pragma GCC diagnostic ignored "-Wfloat-equal".

Lamentablemente, no puede desactivar "-Wall" de esa manera (eso sería demasiado fácil, ¿no?), Tiene que hacer las opciones de advertencia individuales que -Wall permite a mano (al menos, las conflictivas).

Documentos: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

EDITAR: Pero parece que no funciona la advertencia ... Intenté con mi pc.


Usa fgets () en lugar de gets ()

char buffer[BUFSIZ]; /* gets(buffer); */ fgets(buffer,sizeof(buffer), stdin);

La función gets () no verifica la longitud del búfer y puede escribir más allá del final y alterar la pila. Este es el "desbordamiento del búfer" que escuchas.


La respuesta obvia es aprender de lo que el compilador intenta decirle: nunca debe usar get (), ya que es totalmente inseguro. Use fgets () en su lugar, lo que le permite evitar posibles desbordamientos de búfer.

#define BUFFER_SIZE 100 char buff[BUFFER_SIZE]; gets( buff); // unsafe! fgets( buff, sizeof(buff), stdin ); // safe


Contrariamente a la opinión popular, no todos los programadores son igualmente desatentos con lo que escriben. gets() siempre será estándar en C90, y se colocó en la biblioteca por varias buenas razones. No es más "peligroso" que cualquier otra función de cuerda cuando se usa apropiadamente, como en ejemplos de programas, documentación, andamios de pruebas de unidades, tareas, etc.

Además, gets() mejora la legibilidad de una manera que fgets() nunca lo hará. Y uno nunca tiene que interrumpir la línea de pensamiento de uno para buscar en qué orden poner sus argumentos.

La siguiente solución utiliza mi otra función favorita para eliminar la nueva línea. :)

#define gets GET_LOST #include "stdio.h" #undef gets #include "limits.h" char *gets(char *s) { return strtok(fgets(s, INT_MAX, stdin), "/n"); }


Sugerir un sustituto seguro para gets() .

En el código existente, para sustituir gets() , no se puede desear utilizar fgets() ya que esa función requiere un char adicional para guardar el ''/n'' que consumen ambas funciones, pero gets() no guarda. Lo siguiente es un sustituto que no requiere un tamaño de búfer mayor.

Cada gets(dest) se reemplaza por:
Si dest es una matriz, usa gets_sz(dest, sizeof dest)
Si dest es un puntero a una matriz char de tamaño n , use gets_sz(dest, n)

char *gets_sz(char *dest, size_t size) { if (size <= 1) { if (size <= 0 || feof(stdin)) { return NULL; } } size--; size_t i; for (i = 0; i < size; i++) { int ch = getchar(); if (ch == EOF) { if (i == 0) return NULL; break; } if (ch == ''/n'') break; dest[i] = (char) ch; } dest[i] = 0; return dest; }