Desactivar advertencia: ¿la función `gets’ es peligrosa en GCC a través de archivos de encabezado?

4 minutos de lectura

avatar de usuario
Biswajyoti Das

estoy usando la funcion 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 encabezado 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 no aparezca esta advertencia?

La respuesta obvia es aprender de lo que el compilador está tratando de decirle: nunca, nunca, debe usar gets(), ya que es totalmente inseguro. Utilizar fgets() en cambio, 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

  • En la vida real probablemente querrás usar sizeof buff en lugar de duplicar el tamaño del búfer.

    – Bastien Leonard

    31 de julio de 2009 a las 21:39

  • En la vida real, querrá dimensionar el búfer a través de una constante como BUFFSIZE y también usarla en la llamada fgets().

    luego

    31 de julio de 2009 a las 21:42

  • Esto en realidad no responde la pregunta.

    – Mikey TK

    11/09/2014 a las 19:14

avatar de usuario
sam liao

Si realmente quieres úsalo.

Aquí está la 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 “comparación de coma flotante no es segura”, usaría:

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

Desafortunadamente, no puedes deshabilitar “-Wall” de esa manera (eso sería demasiado fácil, ¿no?), tienes que hacer las opciones de advertencia individuales que -Wall habilita a mano (al menos, las conflictivas).

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

EDITAR:
Pero parece que no funciona porque recibe una advertencia… Probé en mi PC.

  • +1 Aunque estoy de acuerdo en que no se debe usar gets (), usted es el único que realmente respondió la pregunta de OP 🙂

    – qrdl

    31 de julio de 2009 a las 19:36

  • Esto solo funciona para los diagnósticos emitidos por el compilador. El mensaje “gets is unsafe” proviene del enlazador y AFAIK no hay forma de desactivarlo.

    – zwol

    25 de febrero de 2011 a las 23:58

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

INSECTOS

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

Use 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 de búfer” del que ha oído hablar.

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

[Edit]

Parece que la advertencia proviene del enlazador. ¿Recibe una advertencia al compilar con -c? (Lo que deshabilita la vinculación.)

avatar de usuario
mike mcquaid

No deberías usar el gets función en absoluto, la página de manual dice que use fgets en lugar de.

GCC no proporciona la funcionalidad que ofrece GCC para deshabilitar las advertencias mediante pragmas. Debes usar los diferentes opciones de advertencia como banderas para el compilador en su lugar.

avatar de usuario
chux – Reincorporar a Monica

Sugiera un sustituto seguro para gets().

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

Cada gets(dest) se reemplaza con:
Si dest es una matriz, utilice gets_sz(dest, sizeof dest)

Si dest es un puntero a un char matriz de tamaño nutilizar 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;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad