È 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?
risposta
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.
PC-Lint è un ottimo strumento che dovrebbe trovarsi nel computer di ogni sviluppatore professionista *. –
Tranne quei milioni di sviluppatori che non toccano mai Windoze. –
Flexlint è un'alternativa a PC-Lint. –
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.
Per le macro definite nei file di origine, è possibile provare il flag gcc/clang -Wunused-macros
. C'è anche -Wunused-local-typedefs
in gcc.
C'è cscout (ora open source) a:
https://github.com/dspinellis/cscout
che trova inutilizzato 'extern', #define.
- 1. I compilatori rimuovono funzioni non utilizzate, definizioni, variabili, macro, ecc.
- 2. come rilevare le importazioni non utilizzate?
- 3. macro e definizioni interne a schema
- 4. Come ricorsive definizioni di macro vengono valutati
- 5. C/C++ definizioni di macro fredde?
- 6. Come rilevare la firma con una macro?
- 7. Le definizioni delle variabili sono utilizzate una volta ottimizzate?
- 8. Non posso rilevare un'eccezione
- 9. typedef NS_ENUM vs typedef enum
- 10. Come posso identificare le chiavi i18n non utilizzate?
- 11. SAS: chiamata di una macro da un'altra ... Ordine delle definizioni macro
- 12. Come posso rilevare caratteri non occidentali?
- 13. Come posso rilevare g ++ e MinGW nel preprocessore C++?
- 14. Trovare definizioni dei metodi impliciti nel contesto macro
- 15. specificatori tipo typedef e non semplici
- 16. Esempi di quali macro di Lisp possono essere utilizzate per
- 17. Posso definire una macro che definisce macro?
- 18. Posso ridefinire una macro C++ e poi definirla?
- 19. Come rimuovere "automaticamente" le unità non utilizzate dalla clausola uses?
- 20. C'è qualche strumento/modo per rilevare/rimuovere tutte le variabili non utilizzate, le macro, le intestazioni (include) e le funzioni dal codice C++?
- 21. Typedef della classe anonima
- 22. #typedef e KVC in objC
- 23. Perché una dichiarazione typedef non è chiamata definizione typedef?
- 24. Perché non posso inoltrare la dichiarazione dei typedef?
- 25. BOOST_FOREACH e modelli senza typedef
- 26. Come posso mappare una macro in Clojure?
- 27. #warning e #error come Macro
- 28. C++ Fortemente digitato usando e typedef
- 29. Come posso ottenere Scala ToolBox per vedere le definizioni REPL?
- 30. Come posso rilevare (e correggere) l'inclinazione delle immagini?
Il * compilatore * non può perché viene eseguito dopo il preprocessore. – chris
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ò. –
@EricFinn, A me non sembra così male a prima vista. So che non è fattibile per basi di codice di grandi dimensioni, però. – chris