2012-01-05 5 views
9

Il seguente file foo.c è una versione semplificata di un bug più sottile che ho trovato nel mio codice.Come ottenere avvisi sulle variabili assegnate, ma non più utilizzate?

int b; 

void bar(int a); 

void foo(int a) 
{ 
    bar(a); 
    a = 42; 
} 

La linea a = 42 è infatti un errore di battitura nel mio codice: volevo dire b = 42. Non mi aspetto che il compilatore rilevi che ho fatto un errore di battitura, ma vorrei ricevere un avviso che sto assegnando a una variabile locale (oa un parametro di funzione) che non verrà più utilizzata. Se compilo questo file con

% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c 

Non ricevo assolutamente alcun avviso. L'ispezione del codice generato mostra che l'assegnazione a = 42 non viene eseguita, quindi gcc è perfettamente a conoscenza che questa istruzione è inutile (quindi potenzialmente falsa). Commentando la chiamata a bar(a); viene generato un avviso warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter], quindi sembra che gcc non venga avvisato fintanto che lo a viene utilizzato da qualche parte nella funzione, anche se è prima dell'assegnazione dello.

Le mie domande:

  1. C'è un modo per dire GCC o Clang per produrre un avvertimento per questo caso? (Non ho potuto ottenere clang 3.0 per produrre alcun avviso, anche con la chiamata a bar rimosso.)
  2. C'è un motivo per il comportamento effettivo? In alcuni casi, è effettivamente preferibile assegnare a variabili locali che verranno eliminate dall'ottimizzatore?
+1

fare l'argomento funzione di un 'const' e il compilatore si lamenta:' void foo (int const a) {/ * ... qualunque cosa ... * /} ' – pmg

+0

@pmg: Cambiare la fonte non è un'opzione: voglio rilevare simili assegnazioni inutili nel mio codice esistente. – adl

+0

@ pmg hehe, nice;) – ouah

risposta

4

Non esiste l'opzione gcc o clang per quanto ne so che può mettere in guardia su questo compito inutile.

PC-Lint d'altra parte è in grado di avvertire in questa situazione.

Attenzione 438 Ultimo valore assegnato a 'simbolo' variabile non utilizzata - Un valore era stato assegnato ad una variabile che non è stato successivamente utilizzato. Il messaggio viene emesso in corrispondenza di un'istruzione return o alla fine di un blocco quando la variabile esce dall'ambito.

-1

Il compilatore rileverà che questo è codice guasto e lo ottimizza comunque. Se si guarda la lista di assemblaggio (a patto di dire a gcc di ottimizzare), allora si troverà che l'assegnazione è inesistente.

+0

Come indicato nella domanda originale, ho già detto a 'gcc' di ottimizzare, e ho già notato che l'assegnazione è stata ottimizzata. La domanda è: perché il compilatore non mi permette di sapere che ho scritto qualcosa di inutile, o come posso configurarlo per farmelo sapere. – adl

+0

Non stai rispondendo alla domanda. Vuole che il compilatore rilevi tale codice, quando il programmatore non ha notato l'errore (e quindi non cercherà di elencare i file). – ugoren