2009-07-31 8 views
6

Sto usando la funzione gets() nel mio codice C. Il mio codice sta funzionando benissimo ma sto ottenendo un messaggio di avvisoDisabilitare i messaggi di avviso in GCC tramite i file di intestazione?

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

voglio che questo messaggio di avviso non a pop-up. C'è un modo?

Mi chiedo se possano esistere 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 utilizzare gets() per questo avviso di non apparire?

risposta

27

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

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

Grazie Neil ... fgets funziona bene. molte grazie. –

+3

Nella vita reale probabilmente si vorrà usare 'sizeof buff' invece di duplicare la dimensione del buffer. –

+3

Nella vita reale, si desidera dimensionare il buffer tramite una costante come BUFFSIZE e utilizzarlo anche nella chiamata fgets(). –

10

Vorrei prestare attenzione e sostituire gets. Questo è abbastanza chiaro per me:

BUGS

Mai usare gets(). Perché è impossibile dire senza conoscere i dati in anticipo quanti caratteri gets() leggerà, e poiché gets() continuerà a memorizzare caratteri oltre la fine del buffer, è estremamente pericoloso da usare. È stato utilizzato per rompere la sicurezza del computer. Usa invece fgets().

8

uso fgets() invece di (ottiene)

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

La funzione gets() non controlla la lunghezza del buffer e può scrivere oltre il fine e alterare la pila. Questo è il "buffer overflow" di cui si sente parlare.

5

Non si dovrebbe usare la funzione gets, la pagina di manuale dice invece di usare fgets.

GCC non fornisce la funzionalità che GCC fa per disabilitare gli avvisi utilizzando la direttiva. È necessario utilizzare i vari warning options come contrassegni sul compilatore.

+0

Questo avviso è fornito dal linker. Non conosco un modo per disabilitarlo. – AProgrammer

6

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

[Edit]

Sembra che l'allarme arriva dal linker. Ricevi avvertimenti durante la compilazione con -c? (Che disabilita il collegamento.)

24

Se si vuole veramente usarlo.

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

Se si utilizza una versione ragionevolmente recente di gcc, è possibile utilizzare:

#pragma GCC diagnostic ignored "your option here" 

Per esempio, se tali intestazioni producono un "confronto in virgola mobile è a rischio" errore, si usa:

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

Purtroppo, non è possibile disabilitare "-Wall" in questo modo (che sarebbe troppo facile, non è vero ...), devi fare la guerra individuale opzioni che -Wall abilita a mano (almeno, quelle in conflitto).

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

EDIT: Ma non sembra lavorano per ottiene avvertimento ... ho provato sul mio pc.

+3

+1 Anche se sono d'accordo sul fatto che gets() non deve essere usato, tu sei l'unico che ha effettivamente risposto alla domanda di OP :) – qrdl

+4

Questo funziona solo per la diagnostica emessa dal * compilatore *. Il messaggio "ottiene è pericoloso" viene dal * linker * e da AFAIK non è possibile disattivarlo. – zwol

-2

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" di qualsiasi altra funzione di stringa quando viene utilizzato in modo appropriato, come ad esempio in esempi di programmi, documentazione, unità di prova ponteggi, compiti a casa, ecc

Cosa c'è di più, gets() migliora la leggibilità in un modo che fgets() non lo farà mai. E non si deve mai interrompere la propria linea di pensiero per cercare in che ordine inserire 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"); 
} 
+8

Chi firma una risposta SO con il proprio nome, numero di telefono e una data? – bgw

+0

Se l'input dell'utente consiste solo di ''\ n'', questa routine restituisce' NULL'. Originale 'gets()' ha restituito '" "' '. – chux

1

Suggerire un sostituto sicuro per gets().

Nel codice esistente, sostituire gets(), non può desiderare di utilizzare fgets() come tale funzione richiede un ulteriore char per salvare il '\n' che entrambe le funzioni consumano, ma gets() non salva. Di seguito è un sostituto che non richiede una dimensione del buffer più grande.

Ogni gets(dest) è sostituire con:
Se dest è un array, utilizzare gets_sz(dest, sizeof dest)
Se dest è un puntatore ad un char array di dimensione 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; 
} 
0

Se davvero si vuole utilizzare prova la bandiera -fsyntax-only.

Il manuale in gcc website dice:

-fsyntax-only

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