2013-04-30 17 views
13

Vogliamo iniziare a utilizzare -Wall -Werror su un progetto di grandi dimensioni.
A causa delle dimensioni, questo cambiamento deve essere graduale e vogliamo iniziare con gli avvertimenti più importanti.Disattiva avviso/errore per gli avvisi predefiniti

Il modo migliore per farlo sembra utilizzare -Wall -Werror, con eccezioni per avvisi specifici. Gli avvertimenti eccezionali sono quelli che abbiamo molto (quindi sistemarli tutti è difficile e rischioso) e non li consideriamo molto pericolosi.
Non sto dicendo che non vogliamo correggere tutti questi avvertimenti - solo non nella prima fase.

Conosco due modi per escludere un avvertimento da -Werror - il migliore è -Wno-error=xxx, e se non funziona - -Wno-xxx (naturalmente, preferiamo vedere l'avvertimento e ignorarlo, invece di nasconderlo).

Il mio problema è con gli avvisi che sono abilitati di default e non hanno un flag -Wxxx ad essi correlato. Non sono riuscito a trovare alcun modo per allentare quando si utilizza -Werror.

Sono specificamente preoccupato per due avvertimenti specifici. Ecco un programma che li e l'output del compilatore presenta:

#include <stdio.h> 
void f(int *p) { printf("%p\n", p); } 

int main(int argc, char *argv[]) { 
     const int *p = NULL; 
     const unsigned int *q = NULL; 
     f(p);   /* Line 7: p is const, f expects non const */ 
     if (p == q) { /* Line 8: p is signed, q is unsigned */ 
       printf("Both NULL\n"); 
     } 
     return 0; 
} 

% gcc warn.c 
warn.c: In function 'main': 
warn.c:7: warning: passing argument 1 of 'f' discards qualifiers from pointer target type 
warn.c:8: warning: comparison of distinct pointer types lacks a cast 

so la soluzione migliore è quella di risolvere questi avvertimenti, ma è molto più facile a dirsi che a farsi. Affinché questo cambiamento abbia successo, dobbiamo farlo in modo graduale e non possiamo fare troppe modifiche contemporaneamente.

Qualche suggerimento? Grazie.

+1

Che ne dici di fare il contrario, cioè abilitare '-Wall' globalmente e' -Werror' solo sulle parti del codice che hai "ripulito"? – Mat

+0

related: http://stackoverflow.com/questions/12163969/how-to-eliminate-the-discard-qualifier-warning –

+2

@ H2CO3 Ha detto che lo aggiusterà, ma in un grande progetto posso vedere non voler affrontare prima questo. Non c'è bisogno di trattarlo come un bambino e tenere qualcosa da lui. –

risposta

1

Che dire di phasing su una base di unità/modulo/libreria di compilazione anziché per avviso? L'attivazione di una compilazione di subtarget è un'opzione (un sistema di build abbastanza buono in atto)?

+0

Fasi di il modulo non è così utile. Ci vorrà molto tempo prima che riusciamo a far sì che gli avvertimenti importanti siano abilitati in tutto il codice in questo modo. Non sono sicuro di cosa intendi attivando un compilazione subtarget. – ugoren

+0

Esatto, ci vorrà molto tempo, ma poiché ciò che stai chiedendo nel post è ** non ** possibile (disabilitando gli avvisi integrati abilitati da -Wall), il problema diventa come filtrare l'output in tale un modo per rendere ragionevole lavorare con Se si lavora su una base di moduli, è possibile affrontare tutti gli avvertimenti in una volta, poiché saranno inerenti a una base di codice molto più piccola. Solo i miei due centesimi. – Blazor

0

Potrebbe essere una follia, ma ...

Perché non un semplice grep?

qualcosa come

gcc teste.c 2>&1 | grep -v 'comparison of distinct' | grep -v 'some_other_string' 

Probabilmente si desidera nascondere queste greps in uno script, e chiamare lo script dal makefile invece di gcc

+0

Un altro suggerimento: esegui almeno un conteggio completo di avvisi con wc -l, per assicurarti di non aggiungere nuovi avvisi che vengono filtrati. – josinalvo

+0

È tutto molto utile per una semplice compilazione. Ma con un progetto complicato, un sacco di sviluppatori, piattaforme, metodi di compilazione, questo approccio diventa abbastanza difficile. – ugoren

+0

@ugoren "molti metodi di compilazione" ?? Se non tutti usano lo stesso sistema di build, allora potresti avere problemi più grandi da affrontare. –

Problemi correlati