Domanda

Sto usando la funzione gets () nel mio codice C. Il mio codice funziona correttamente ma ricevo un messaggio di avviso

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

Voglio che questo messaggio di avviso non venga visualizzato. C'è un modo?

Mi chiedo che potrebbero esserci tali possibilità creando un file di intestazione per disabilitare alcuni avvisi. O c'è qualche opzione durante la compilazione che può servire al mio scopo? O potrebbe esserci un modo particolare di usare gets () per non far apparire questo avviso?

È stato utile?

Soluzione

La risposta ovvia è imparare da ciò che il compilatore sta cercando di dirti: non dovresti mai e poi mai usare get (), poiché è totalmente insicuro. Utilizzare invece fgets () , che consente di prevenire possibili sovraccarichi del buffer.

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

Altri suggerimenti

Se vuoi davvero usarlo.

Ecco la risposta da: http://www.gamedev.net /community/forums/topic.asp?topic_id=523641

Se usi una versione ragionevolmente recente di gcc, puoi usare:

#pragma GCC diagnostic ignored "your option here"

Ad esempio, se quelle intestazioni producono un confronto a virgola mobile "non sicuro" non è sicuro " errore, useresti:

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

Sfortunatamente, non puoi disabilitare " -Wall " in questo modo (sarebbe troppo facile, no ...), devi fare le singole opzioni di avviso che -Wall abilita a mano (almeno, quelle in conflitto).

Documenti: http://gcc.gnu.org/ onlinedocs / gcc / diagnostico-Pragmas.html # diagnostico-Pragma

Modifica Ma sembra non funzionare per ricevere avvisi ... Ho provato sul mio pc.

Vorrei ascoltare l'avvertimento e sostituire ottiene . Questo è abbastanza chiaro per me:

  

BUGS

     

Non usare mai gets (). Perché è impossibile dirlo senza conoscere i dati   anticipa quanti caratteri riceverà () e perché get () continuerà a memorizzare   caratteri oltre la fine del buffer, è estremamente pericoloso da usare. Esso ha   stato usato per violare la sicurezza del computer. Usa invece fgets ().

Usa fgets () invece di gets ()

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

La funzione gets () non controlla la lunghezza del buffer e può scrivere oltre la fine e alterare lo stack. Questo è il "buffer overflow" di cui hai sentito parlare.

Non c'è davvero alcun buon motivo per usare gets () . Anche lo standard C dice che è obsoleto! Utilizzare invece fgets () .

[Modifica]

Sembra che l'avvertimento provenga dal linker. Ricevi un avviso durante la compilazione con -c ? (Che disabilita il collegamento.)

Non dovresti usare affatto la funzione gets , la manpage dice invece di usare fgets .

GCC non fornisce la funzionalità di GCC per disabilitare gli avvisi tramite i pragmi. È necessario utilizzare le varie opzioni di avviso come flag per compilatore invece.

Suggerisci un sostituto sicuro di gets () .

Nel codice esistente, per sostituire gets () , potrebbe non essere opportuno utilizzare fgets () poiché tale funzione richiede un char per salvare il '\ n' utilizzato da entrambe le funzioni, ma gets () non viene salvato. Di seguito è riportato un sostituto che non richiede una dimensione del buffer maggiore.

Ogni ottiene (dest) è sostituito da:
Se dest è un array, utilizzare gets_sz (dest, sizeof dest)
Se dest è un puntatore a un array char di dimensioni n , utilizzare 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;
}

Se vuoi davvero usarlo, prova il flag -fsyntax-only .

Il manuale nel sito web gcc dice:

  

-fsyntax-only

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

-fno-stack-protector è un'opzione che consente di utilizzare la funzione gets () nonostante non sia sicura.

-Wno-deprecated-dichiarazioni disattiva l'avviso di deprecazione

Ecco un esempio di compilazione con gets()

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

Concordo con tutti coloro che affermano che è completamente pericoloso poiché consentirà a un programma di sovraccaricare un buffer. Questo può essere abbastanza pericoloso e quindi il motivo per cui è stato deprecato a favore dei budget.

Tuttavia, se stai prendendo un'introduzione al corso sulla sicurezza, è molto utile essere in grado di scrivere un piccolo programma di test per giocare con i concetti di sovraccarico del buffer e overflow dello stack.

Contrariamente all'opinione popolare, non tutti i programmatori sono ugualmente disattenti a ciò che stanno scrivendo. gets () sarà sempre standard in C90 ed è stato inserito nella libreria per diversi buoni motivi. Non è più " pericoloso " rispetto a qualsiasi altra funzione di stringa se utilizzata in modo appropriato, ad esempio in esempi di programma, documentazione, ponteggi di unit test, compiti a casa, ecc.

Inoltre, gets () migliora la leggibilità in modo che fgets () non lo farà mai. E non si deve mai interrompere il proprio percorso di pensiero per cercare in quale ordine mettere i propri argomenti.

La seguente soluzione alternativa utilizza la mia altra funzione preferita per rimuovere la nuova riga. :)

 #define gets GET_LOST
 #include "stdio.h"
 #undef gets

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top