2013-05-14 15 views
12

Ho dovuto personalizzare alcuni progetti che sono stati scritti per altri scopi, ma alcune funzionalità di base sono uguali per il mio progetto e funzionano così com'è. Ma ci sono un sacco di variabili, macro, funzioni ecc. Che non sono utili per il mio contesto attuale e stanno semplicemente rendendo il codice molto a disagio da leggere e inutilmente grande.C'è qualche strumento/modo per rilevare/rimuovere tutte le variabili non utilizzate, le macro, le intestazioni (include) e le funzioni dal codice C++?

Così ho iniziato a rimuovere le funzioni di macro delle variabili ecc. Usando "Trova riferimenti" e "Mostra grafico chiamate" in Netbeans. Sto usando gli strumenti di sviluppo remoto di netbeans per c/C++. Ma è ingombrante. Quindi c'è qualche strumento per fare questo pulire?

+1

Forse il [clang static analyzer] (http://clang-analyzer.llvm.org/) per l'analisi semantica? –

+0

In realtà, clang avverte su variabili e funzioni non utilizzate anche durante la normale compilazione. – ltjax

+1

Questo è più difficile di quanto sembri. Come fai a sapere se un # include è inutilizzato? Voglio dire che puoi avere qualcosa come un #define che mappa 'malloc()' su 'malloc_dbg()' lì e poi compila sia con che senza quel file, solo il comportamento cambia. – sharptooth

risposta

9

Da quello che so al momento non c'è strumento che fa tutte le cose che hai menzionato, ma ce n'è uno che aiuta a ripulire il inutilizzata includono intestazioni: include-what-you-use

"Includere ciò che si utilizza "significa questo: per ogni simbolo (tipo, funzione variabile o macro) che usi in foo.cc, foo.cc o foo.h dovrebbe #include un file .h che esporta la dichiarazione di quel simbolo. Lo strumento include-what-you-use è un programma che può essere compilato con le librerie clang per analizzare #inclusi dei file di origine per trovare le violazioni include-what-you-use e suggerire delle correzioni per esse.

L'obiettivo principale di include-what-you-use è rimuovere #inclusi superflui. Lo fa sia scoprendo che #include non sono effettivamente necessari per questo file (per entrambi i file .cc e .h), e sostituendo # include anche forward-dichiari quando possibile.

Ci si potrebbe aspettare che la Clang static analyzer farebbe questo, ma da quello che vedo the availalbe checks non offrire tali cose.

questo potrebbe essere un buon momento per qualcuno di suggest a feature request verso l'analizzatore o creare uno strumento separato con LibTooling alla pari simile con gli strumenti descritti in Clang Tools

Nel frattempo, io suggerirei di attivare - Muro e -Wextra flag di compilazione, che attiverà le seguenti avvertenze (tra gli altri) (vedi la documentazione di GCC sotto):

  • -Wunused funzione
  • -Wunused-label
  • -Wunused valore
  • -Wunused parametri -Wunused variabile
  • set-parametro -Wunused-but-

Se per Qualche ragione per cui non vuoi farlo, potresti semplicemente aggiungere -Wunused che abiliterà solo le opzioni di -Wunused sopra, senza gli altri flag che -Wall o -Wextra aggiunge.

Ma al fine di ottenere un avvertimento circa un parametro di funzione non utilizzata, è necessario specificare -Wextra -Wunused (si noti che -Wall implica -Wunused), oppure separatamente specificare -Wunused-parametro.

Naturalmente, questo significa che si deve fare tale operazione manualmente

Se si vuole essere pignoli in più si potrebbe anche convertire tutti gli avvertimenti in errori con l'aggiunta del -pedantic -errors flag

Per ulteriori dettagli leggere lo GCC Warnings Options documentation.

2

Qualche volta ho usato il metodo di marcatura un grosso blocco di codice come "non utilizzato" aggiungendo

#if 0 
    ... lots of code 
#endif 

È quindi possibile compilare il codice e vedere che cosa va storto. Analizza gli errori "X varibale non dichiarati" e ripristina i bit necessari per quello. Puoi farlo tagliando il blocco #if 0 (aggiungendo uno #endif, poi un nuovo #if 0 un po 'più in basso), o spostando i pezzi che ti servono fuori dal blocco corrente.

Ad esempio, se si dispone di un blocco di variabili globali o macro, è sufficiente inserire #if 0 attorno a tutti e vedere quali sono effettivamente utilizzati. [Anche se i macro possono essere un po 'più complicati se vengono utilizzati in #ifdef e così via].

Sarei sorpreso se non c'è uno strumento là fuori, ma allo stesso tempo, devi ancora fare il lavoro di taglio, e una volta che hai una grande porzione di codice in #if 0 ... #endif, è abbastanza facile taglialo fuori.

+0

Posso farlo manualmente e lo sto facendo al momento. Ma stavo chiedendo dello strumento per analizzare automaticamente la fonte e mostrarmi le cose da rimuovere. Ad esempio: in eclipse o netbeans per Java, IDE mostra la variabile inutilizzata o l'importazione inutilizzata ecc. – Sreekar

+0

il '#if 0' non è molto sicuro a causa della ricerca del nome - ad es. se un'intestazione è stata cancellata usando '#if 0', il compilatore può semplicemente usare una funzione (che è chiamata) dove tale funzione è anche dichiarata in un ambito esterno.poiché la maggior parte delle persone tende a non qualificare esplicitamente gli ambiti, l'approccio ha il potenziale per introdurre bug relativi alla ricerca del nome senza preavviso. – justin

0

Molti strumenti di analisi del codice statico forniscono le informazioni desiderate. Wikipedia has a list. Abbiamo utilizzato con successo such a tool (con alcune modifiche personalizzate) per rimuovere include e velocizzare il tempo di compilazione.