2008-11-26 23 views
51

Ho un progetto C++ legacy di grandi dimensioni compilato in Visual Studio 2008. So che esiste una quantità ragionevole di codice "morto" a cui non si accede da qualsiasi parte - metodi che non vengono chiamati, intere classi che non sono usatiIdentificazione codice guasto (C++)

Sto cercando uno strumento che identificherà questo analisi statica.

Questa domanda: Dead code detection in legacy C/C++ project suggerisce di utilizzare gli strumenti di copertura del codice. Questa non è un'opzione in quanto la copertura del test non è abbastanza alta.

Indica anche un codice -Wunreachable. opzione per gcc. Mi piacerebbe qualcosa di simile per Visual Studio. Utilizziamo 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).

Ci sono delle opzioni migliori che funzionano bene con un progetto di Visual Studio?

+0

Molto interessato a sentire le risposte, ma non ho nulla da aggiungere se non un upvote. :) –

+0

Mi stavo chiedendo esattamente lo stesso l'altro giorno. – Coincoin

+0

Anch'io. Sembra un'opportunità di business ... – NotMe

risposta

6

Vorrete qualcosa sulla falsariga di QA-C++ (http://www.programmingresearch.com/QACPP_MAIN.html), vedere 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 codice non raggiungibile; molte linee guida di codifica (come MISRA-C++, se non sbaglio) richiedono che non esista un codice non raggiungibile. Uno strumento di analisi orientato specificamente a far rispettare tale linea guida sarebbe la soluzione migliore.

E ti piacerebbe trovare altri usi dello strumento.

3

Non conosco Visual C e ho anche consigliato gli strumenti di copertura specifici del codice -Wunreachable. Come soluzione per la vostra situazione vorrei provare il seguente:

  1. fanno con ctags (o programma simile) un elenco di tutti i simboli nella vostra fonte
  2. Attiva nel vostro compilatore l'eliminazione codice morto (presumo che l'impostazione predefinita è
  3. Abilita le ottimizzazioni del tempo dell'intero programma/collegamento (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 chiamata (ad es. doxygen).

0

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

Quando un programma Delphi viene eseguito con il debugger, l'IDE mostra nel 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é non è possibile impostare i punti di interruzione.

Alcune note aggiuntive, come commentatori sembrano fraintendere questo:

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

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

c: Non conosco abbastanza bene VS2008, quindi non posso dire se questo suggerimento funzionerà.

+0

Fantastica idea! VS non consentirà breakpoint in questo modo in una build di rilascio ... ma non penso che metta in evidenza le linee interessate visivamente. Si può guardare la vista mista assembly/source per vedere quali linee non hanno assembly. –

+0

VS non consentirebbe i breakpoint nel codice che non è "morto", ma disabilitato usando le macro. Così si può finire per rompere alcune macro rimuovendo il codice apparentemente morto. Questo è pericoloso! –

+0

@ Ignas: E in che modo, esattamente, QUALSIASI approccio si occuperà di questo problema? – Roddy

-2

Scrive uno script che elimina in modo casuale una funzione (dal codice sorgente) e ricompila tutto da zero. Se è ancora compilato, quella funzione era un codice morto.

+8

Questo non funzionerà. Cosa succede se c'è una catena di 3 funzioni correlate, un codice "cul-de-sac". La rimozione di una qualsiasi delle funzioni farà sì che la compilazione si interrompa, anche se l'insieme di esse è, insieme, un codice morto. – Cheeso

+0

Funzionerà in alcuni scenari e quindi penso che sia una grande idea. – tmighty

8

So che i prodotti Lint di Gimpel (PC-Lint e Flexelint) identificheranno il codice irraggiungibile e i moduli inutilizzati/non referenziati.

Entrambi rientrano nella categoria degli strumenti di analisi statica.

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

0

vi suggerisco di utilizzare un paio di approcci: 1. GCC ha alcuni flag di compilazione utili:

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

2. Cppcheck ha alcune caratteristiche utili come:

--enable=unusedFunction 

3. Utilizzare analizzatore statico come è stato suggerito prima.

Problemi correlati