2013-05-15 21 views
8

È facile ottenere un elenco di funzioni e variabili inutilizzate con feedback del linker, ma come posso rilevare quelle definizioni di macro non utilizzate & typedefs? Devo sfogliare il codice riga per riga e git grep nell'intero progetto?Come posso rilevare definizioni macro non utilizzate e typedef?

+7

Il * compilatore * non può perché viene eseguito dopo il preprocessore. – chris

+3

Suppongo che una soluzione diversa dalla lettura di codice e grepping sarebbe quella di eseguire 'gcc -E' con una data macro e senza una data macro, quindi confrontare i risultati. Se sono uguali, la macro non è stata utilizzata nel codice. C'è probabilmente un modo molto migliore per farlo, però. –

+0

@EricFinn, A me non sembra così male a prima vista. So che non è fattibile per basi di codice di grandi dimensioni, però. – chris

risposta

7

Gli strumenti di analisi statica per i programmi C e C++ possono includere un controllo sulle macro del preprocessore non utilizzate.

Per esempio vedere PC-Lint.

Un'altra possibilità sarebbe quella di andare in specifici file di inclusione e utilizzare #ifdef 0 per rimuovere ampie sezioni di macro e quindi rivedere gli errori del compilatore utilizzando una sorta di algoritmo divide and conquer.

Tuttavia, mi aspetto che uno strumento di analisi statico sarebbe un approccio molto migliore in quanto le dimensioni del codice sorgente diventano grandi.

+0

PC-Lint è un ottimo strumento che dovrebbe trovarsi nel computer di ogni sviluppatore professionista *. –

+3

Tranne quei milioni di sviluppatori che non toccano mai Windoze. –

+1

Flexlint è un'alternativa a PC-Lint. –

2

Per le macro non utilizzate, è possibile dare un'occhiata a coan. Ha opzioni che potrebbero aiutare con questo compito. Da about page:

Quali simboli appaiono all'interno di direttive preprocessore attive in una determinata configurazione?

(Una direttiva di preprocessore è attiva se non rientra nell'ambito di alcun falso #if). Supponendo di essere interessato all'app C-source, è possibile visualizzare un elenco di questi simboli, con nomi di file e numeri di riga, con il comando:

$> simboli coan --recurse --locate - --once attiva --Filter c, h app

ha opzioni per rimuovere pezzi di codice (#if 0 e amici) condizionati fuori, e molte altre caratteristiche utili per affrontare il preprocessore C. Lo userei per raccogliere tutti i simboli #define d e tutti i simboli e gli amici #ifdef o defined. Ordinerò e uniq queste due raccolte di simboli e li diff. Questo è un buon modo per localizzare gli errori di battitura. Poi prenderei un istogramma di loro separatamente e inizierei con il meno frequente e aprirò le mie liste.

Per i typedef non utilizzati, questa è un'altra sfida. È possibile utilizzare un programma di tipo di riferimento incrociato come OpenGrok o GNU Global, ma non è molto automatico.

7

Per le macro definite nei file di origine, è possibile provare il flag gcc/clang -Wunused-macros. C'è anche -Wunused-local-typedefs in gcc.

Problemi correlati