2009-07-31 20 views
6

Estoy usando la función gets() en mi código C. Mi código está trabajando bien, pero estoy recibiendo un mensaje de advertenciaDeshabilitar mensajes de advertencia en GCC a través de archivos de encabezado?

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

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

Me pregunto si podría haber tales posibilidades mediante la creación de 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?

Respuesta

27

La respuesta obvia es aprender de lo que el compilador intenta decirte: nunca debes usar gets(), 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 
+0

, gracias Neil ... fgets funciona bien. muchas gracias. –

+3

En la vida real, es probable que desee utilizar 'sizeof buff' en lugar de duplicar el tamaño del búfer. –

+3

En la vida real, querrás dimensionar el buffer a través de una constante como BUFFSIZE y también usar eso en la llamada fgets(). –

10

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

FALLOS

No utilice nunca se pone(). Debido a que es imposible saber sin conocer los datos en , avance la cantidad de caracteres que get() leerá, y porque gets() continuará almacenando caracteres después del final del búfer, es extremadamente peligroso de usar. Se ha utilizado para romper la seguridad informática. Use fgets() en su lugar.

8

Use fgets() en lugar de() obtiene

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

La función gets() no comprueba 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.

5

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

GCC no proporciona la funcionalidad que GCC tiene para deshabilitar las advertencias mediante pragmas. En su lugar, debe usar los diversos warning options como indicadores para el compilador.

+0

Esta advertencia viene dada por el vinculador. No sé cómo deshabilitarlo. – AProgrammer

6

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

[Editar]

Parece que la advertencia viene del enlazador. ¿Recibes una advertencia al compilar con -c? (Lo cual deshabilita el enlace.)

24

Si realmente desea usarlo.

Aquí está la respuesta Desde: http://www.gamedev.net/community/forums/topic.asp?topic_id=523641

Si utiliza una versión bastante reciente de gcc, se puede utilizar:

#pragma GCC diagnostic ignored "your option here" 

Por ejemplo, si los encabezados producen una "comparación de punto flotante no es seguro" error, se debería utilizar:

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

Por desgracia, no se puede desactivar "-Wall" de esa manera (que sería demasiado fácil, ¿no es así ...), que tiene que hacer la guerra individuo opciones que -Wall permite a mano (al menos, las conflictivas).

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

EDIT: Pero parece que no trabajan para advertir consigue ... me trataron en mi pc.

+3

+1 Aunque estoy de acuerdo en que get() no debe usarse, usted es el único que realmente respondió la pregunta de OP :) – qrdl

+4

Esto solo funciona para los diagnósticos emitidos por * compilador *. El mensaje "obtiene es inseguro" viene del * linker * y AFAIK no hay forma de desactivarlo. – zwol

-2

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

Lo que es más, gets() mejora la legibilidad de una manera que fgets() nunca lo hará. Y uno nunca tiene que interrumpir la línea de pensamiento para buscar en qué orden colocar 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"); 
} 
+8

¿Quién firma una respuesta SO con su nombre, número de teléfono y una fecha? – bgw

+0

Si la entrada del usuario consiste solamente en ''\ n'', esta rutina devuelve' NULL'. Original 'gets()' returned '" "'. – chux

1

Sugiere un sustituto seguro para gets().

En código existente, para sustituir gets(), no puede ser deseable utilizar fgets() como que la función requiere un adicional char para guardar el '\n' que ambas funciones consumen, pero gets() no salva. Lo siguiente es un sustituto que no requiere un tamaño de búfer mayor.

Cada gets(dest) es reemplazar con:
Si dest es una matriz, utilice gets_sz(dest, sizeof dest)
Si dest es un puntero a un char matriz de tamaño n, utilice 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; 
} 
0

Si realmente desea utilizar él, pruebe la bandera -fsyntax-only.

El manual de gcc website dice:

-fsyntax-only

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