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:
- 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.) - C'è un motivo per il comportamento effettivo? In alcuni casi, è effettivamente preferibile assegnare a variabili locali che verranno eliminate dall'ottimizzatore?
fare l'argomento funzione di un 'const' e il compilatore si lamenta:' void foo (int const a) {/ * ... qualunque cosa ... * /} ' – pmg
@pmg: Cambiare la fonte non è un'opzione: voglio rilevare simili assegnazioni inutili nel mio codice esistente. – adl
@ pmg hehe, nice;) – ouah