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

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 comstackción que pueda servir para mi propósito? ¿O puede haber una forma particular de usar gets() para que esta advertencia no aparezca?

La respuesta obvia es aprender de lo que el comstackdor 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 

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". 

Desafortunadamente, 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.

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.

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 stack. Este es el “desbordamiento del búfer” que escuchas.

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 comstacks con -c ? (Lo cual deshabilita el enlace)

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 comstackdor.

Sugerir un sustituto seguro para gets() .

En el código existente, para sustituir gets() , no se puede desear usar 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; } 

Si realmente quieres usarlo, prueba con la bandera -fsyntax-only .

El manual en el sitio web de gcc dice:

-fsyntax-only

 Check the code for syntax errors, but don't do anything beyond that. 

Contrariamente a la opinión popular, no todos los progtwigdores 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 progtwigs, 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"); }