Pregunta

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ían existir tales posibilidades al crear un archivo de encabezado para deshabilitar algunas advertencias. ¿O hay alguna opción durante la compilación que pueda servir a mi propósito? ¿O puede haber una forma particular de usar gets () para que esta advertencia no aparezca?

¿Fue útil?

Solución

La respuesta obvia es aprender de lo que el compilador está tratando de decirte: nunca deberías usar gets (), ya que es totalmente inseguro. Utilice fgets () en su lugar, lo que le permite evitar posibles desbordamientos del búfer.

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

Otros consejos

Si realmente quieres usarlo.

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 una "comparación de punto flotante no es seguro" error, usarías:

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

Desafortunadamente, no puede deshabilitar " -Wall " de esa manera (sería demasiado fácil, ¿no es así?), debe 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 para obtener advertencia ... Lo intenté en mi PC.

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

  

ERRORES

     

Nunca use gets (). Porque es imposible saberlo sin conocer los datos en   avance cuántos caracteres se leerá gets () y porque gets () continuará almacenando   caracteres más allá del final del búfer, es extremadamente peligroso de usar. Tiene   Se ha utilizado para romper la seguridad informática. Use 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 del búfer" te enteraste.

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

[Editar]

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

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 hace GCC para deshabilitar las advertencias mediante pragmas. Debe utilizar las diversas opciones de advertencia como indicadores de las compilador en su lugar.

Sugerir un sustituto seguro para gets () .

En el código existente, para sustituir gets () , es posible que no desee utilizar fgets () ya que esa función requiere un char para guardar el '\ n' que ambas funciones consumen, pero gets () no guarda. A continuación se incluye un sustituto que no requiere un tamaño de búfer más grande.

Cada gets (dest) se reemplaza con:
Si dest es una matriz, use 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 el indicador -fsyntax-only .

El manual en sitio web de gcc dice:

  

-fsyntax-only

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

-fno-stack-protector es una opción que permite utilizar la función gets () a pesar de lo insegura que es.

-Wno-deprecated-declaraciones desactiva la advertencia de desaprobación

Aquí hay un ejemplo de compilación con gets()

gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations

Estoy de acuerdo con todos los que dicen que es completamente inseguro ya que permitirá que un programa supere un búfer. Esto puede ser bastante peligroso y, por lo tanto, la razón por la que se ha desaprobado en favor de los fgets.

Sin embargo, si está haciendo una introducción al curso de seguridad, es muy útil poder escribir un pequeño programa de prueba para jugar con los conceptos de desbordamiento de búfer y desbordamientos de pila.

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. Ya no es "peligroso" que cualquier otra función de cadena cuando se usa apropiadamente, como en ejemplos de programas, documentación, andamios de pruebas unitarias, tareas, etc.

Además, gets () mejora la legibilidad de una manera que fgets () nunca lo hará. Y uno nunca tiene que interrumpir el tren de pensamiento 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");
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top