Estoy utilizando la función gets() en mi C código.
Mi código está trabajando bien, pero estoy recibiendo un mensaje de advertencia

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

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

Me pregunto que hay posibilidades mediante la creación de un archivo de encabezado para la desactivación de algunas advertencias. O hay alguna opción durante la compilación que puede servir a mi propósito? O puede ser que hay una manera particular de utilizar gets() para esta advertencia no pop-up?

OriginalEl autor Biswajyoti Das | 2009-07-31

10 Comentarios

  1. 27

    La respuesta obvia es aprender de lo que el compilador está tratando de decir a usted – usted debe nunca, nunca, usar gets(), ya que es totalmente inseguro. Uso fgets() 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
    Gracias Neil…fgets funciona bien. muchas gracias.
    En la vida real probablemente vas a querer usar sizeof buff en lugar de duplicar el tamaño del búfer.
    En la vida real que se desea para el tamaño del búfer a través de una constante como BUFFSIZE y también el uso que en el fgets ().
    En realidad, no se contesta a la pregunta.

    OriginalEl autor

  2. 24

    Si usted realmente desea utilizar.

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

    Si utiliza un razonablemente reciente versión de gcc, se puede utilizar:

    #pragma GCC diagnostic ignored "your option here"

    Por ejemplo, si los encabezados de producir un “punto flotante comparación no es seguro” de error, se debería utilizar:

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

    Por desgracia, no se puede deshabilitar “Pared” de esa manera (eso sería demasiado fácil, ¿no es así…), usted tiene que hacer el individuo opciones de aviso que de la Pared permite a mano (al menos, en el conflicto).

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

    EDICIÓN:
    Pero parece que no trabajo para la obtiene de advertencia… he probado en mi pc.

    +1 Aunque estoy de acuerdo en que se presenta() no debe ser utilizado, usted es el único que en realidad responde OP pregunta 🙂
    Esto sólo funciona para los diagnósticos emitidos por el compilador. El “obtiene es inseguro” mensaje viene de la vinculador y AFAIK no hay manera de desactivarlo.

    OriginalEl autor Sam Liao

  3. 10

    Me gustaría prestar atención a la advertencia y reemplazar gets. Esto es suficientemente claro para mí:

    ERRORES

    Nunca usar gets(). Porque es imposible saberlo sin conocer los datos en
    avance de cómo muchos de los personajes gets() lee, y porque gets() seguirá tienda
    caracteres pasado el final del búfer, es extremadamente peligroso para su uso. Se ha
    sido utilizado para romper la seguridad de la computadora. Usar fgets() en su lugar.

    OriginalEl autor Dirk Eddelbuettel

  4. 8

    Usar fgets() en lugar de gets()

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

    El gets() la función no comprueba la longitud de búfer y escribir más allá del final y alterar la pila. Este es el “desbordamiento de búfer” se oye hablar.

    OriginalEl autor Devon_C_Miller

  5. 6

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

    [Editar]

    Parece que la advertencia viene desde el vinculador. ¿De aviso cuando se compila con -c? (Que desactiva los enlaces.)

    OriginalEl autor Bastien Léonard

  6. 5

    Usted no debe usar el gets funcionar, el manual dice que el uso de fgets lugar.

    GCC no proporciona la funcionalidad que GCC no para deshabilitar las advertencias el uso de pragmas. Usted debe utilizar los diversos opciones de aviso como banderas para el compilador lugar.

    Esta advertencia es dada por el enlazador. No sé la manera de desactivarlo.

    OriginalEl autor Mike McQuaid

  7. 1

    Sugieren un substituto seguro para gets().

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

    Cada gets(dest) es reemplazar con:

    Si dest es una matriz, uso gets_sz(dest, sizeof dest)

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

    OriginalEl autor chux

  8. 0

    Si usted realmente quiere usar, tratar la bandera -fsyntax-only.

    El manual en gcc sitio web dice:

    -fsyntax-only

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

    OriginalEl autor j3r3mias

  9. 0

    -fno-stack-protector es una opción que permite la gets() función para ser utilizado a pesar de lo inseguro que es.

    -Wno-deprecated-declarations apaga el mismo mensaje de advertencia

    He aquí un ejemplo de compilar con gets()

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

    Estoy de acuerdo con todo el que se dice que es completamente seguro, ya que va a permitir que un programa de desbordamiento de búfer. Esto puede ser muy peligroso y, por tanto, la razón por la que ha sido despreciado en favor de fgets.

    Sin embargo, si usted está tomando una introducción a la seguridad supuesto, ser capaz de escribir un pequeño programa de prueba a jugar con los conceptos de desbordamiento de búfer y desbordamientos de pila es muy útil.

    OriginalEl autor Peter Madruga

  10. -2

    Contrario a la opinión popular, no todos los programadores son igual de no prestar atención a lo que están escribiendo. gets() siempre será estándar en C90, y se presentó en la biblioteca por varias buenas razones. No es más “peligroso” que cualquier otra cadena de funcionar cuando se utiliza adecuadamente, como en el programa de ejemplos, documentación, pruebas unitarias de andamios, 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 un tren de pensamiento para buscar lo que el fin de poner sus argumentos.

    La siguiente solución utiliza mi otro favorito de la función para eliminar el salto de 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");
     }
    Que signos de una respuesta con su nombre, número de teléfono, y una fecha?
    Si la entrada del usuario consiste sólo de '\n', esta rutina devuelve NULL. Original gets() devuelto "".

    OriginalEl autor Marc W. Abel

Dejar respuesta

Please enter your comment!
Please enter your name here