Domanda

Ho un grande progetto C ++ legacy compilato in Visual Studio 2008. So che esiste una quantità ragionevole di codice "morto" a cui non si accede da nessuna parte - metodi che non vengono chiamati, intere classi che non vengono utilizzate.

Sto cercando uno strumento che lo identifichi mediante analisi statica .

Questa domanda: Rilevamento del codice morto nel progetto C / C ++ legacy suggerisce di utilizzare strumenti di copertura del codice. Questa non è un'opzione in quanto la copertura del test non è abbastanza elevata.

Menziona anche un codice -Wunreachable. opzione per gcc. Vorrei qualcosa di simile per Visual Studio. Usiamo già l'opzione linker / OPT: REF per rimuovere il codice ridondante, ma questo non riporta il codice morto a un livello utile (se usato con / VERBOSE ci sono oltre 100.000 righe, incluso molto dalle librerie).

Esistono opzioni migliori che funzionano bene con un progetto Visual Studio?

È stato utile?

Soluzione

Ti consigliamo qualcosa sulla falsariga di QA-C ++ ( http: //www.programmingresearch. com / QACPP_MAIN.html ), vedi anche http://en.wikipedia.org/wiki / List_of_tools_for_static_code_analysis per prodotti simili.

Stai cercando uno strumento di analisi del codice statico che rilevi un codice non raggiungibile; molte linee guida per la codifica (come MISRA-C ++, se non sbaglio) richiedono che non esista un codice irraggiungibile. Uno strumento di analisi orientato specificamente a far rispettare tale orientamento sarebbe la soluzione migliore.

E ti piacerebbe trovare anche altri usi per lo strumento.

Altri suggerimenti

So che i prodotti Limp di Gimpel ( PC-Lint e Flexelint ) identificherà il codice non raggiungibile e i moduli non utilizzati / non referenziati.

Entrambi rientrano nella categoria di strumenti di analisi statica.

Non ho affiliazione con Gimpel, solo un cliente soddisfatto a lungo termine.

Non conosco Visual C e avevo anche consigliato gli strumenti di copertura specifici del codice -Wunreachable. Come soluzione per la tua situazione, proverei quanto segue:

  1. Crea con ctags (o un programma simile) un elenco di tutti i tuoi simboli nella tua sorgente
  2. Abilita nel tuo compilatore l'eliminazione del codice morto (suppongo che l'impostazione predefinita sia on)
  3. Abilita le ottimizzazioni del tempo dell'intero programma / link (quindi sa che le funzioni non utilizzate nei tuoi moduli non sono richieste da altri esterni e vengono scartate)
  4. Prendi i simboli dal tuo binario e confrontali con i simboli da 1.

Un altro approccio potrebbe essere uno strumento di generazione di grafici di chiamate (ad esempio doxygen).

Ti suggerisco di usare un paio di approcci: 1. GCC ha alcuni utili flag di compilazione:

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter

2. Cppcheck ha alcune funzioni utili come:

 --enable=unusedFunction

3. Utilizza l'analizzatore statico come suggerito in precedenza.

Un approccio che funziona per me - con Delphi - è abilitare il debug ed eseguire il programma con il debugger.

Quando un programma Delphi viene eseguito con il debugger, l'IDE mostra a margine quali righe di codice possono essere impostate come punti di interruzione. Il codice che è veramente morto - cioè, è stato rimosso dal linker / compilatore è ovvio poiché i punti di interruzione non possono essere impostati lì.

Alcune note aggiuntive, poiché i commentatori sembrano fraintendere questo:

a: Non è necessario provare a impostare un punto di interruzione su ogni riga. Basta aprire il file sorgente nell'IDE e scorrere rapidamente attraverso di esso. Il codice morto è facilmente individuabile.

b: NON si tratta di un controllo di "copertura del codice". Non è necessario eseguire l'applicazione per vedere se raggiunge le linee.

c: Non ho abbastanza familiarità con VS2008, quindi non posso dire se questo suggerimento funzionerà.

In entrambi i
1) MSVC è poco utilizzato nello strumento di analisi statica incorporato . > 2) MSVC marketplace ha molti strumenti tra cui il supporto per la maggior parte degli strumenti gratuiti, incluso CppCheck

Avrai bisogno dell'ultima versione di Visual Studio per le applicazioni sul mercato, ma il gratuito " Community Edition " ha una licenza molto indulgente.

Scrivi uno script che elimina casualmente una funzione (dal codice sorgente) e ricompila tutto da zero. Se continua a essere compilato, quella funzione era un codice morto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top