2010-03-04 8 views
42

Attualmente sto lavorando a un'applicazione C++ grande e vecchia che ha avuto molti sviluppatori prima di me. C'è un sacco di "codice morto" nel progetto, classi e funzioni che non sono più utilizzate da nessuno.Ricerca di "codice guasto" in un'applicazione legacy C++ di grandi dimensioni

Quali strumenti sono disponibili per C++ per eseguire un'analisi di base di codice di grandi dimensioni per rilevare e rifattorizzare il codice guasto? Nota: non sto parlando di strumento di copertura del test come gcov.

Come si trova il codice guasto nel progetto?

+2

utilizzare una sorta di strumento di copertura di codice. Stavo per suggerire 'gcov' ma non so cosa sia disponibile in VC. –

+0

Abbiamo usato Bullseye con successo. Ecco un link per una copia di valutazione. http://www.bullseye.com/evaluation.html –

+0

Questa domanda ha una grande soluzione per gcc: [? C'è un modo per ottenere gcc per mettere in guardia sulle funzioni non utilizzate] (http://stackoverflow.com/questions/9091397/is-there-a-way-get-gcc-to-warn-about-funzioni non utilizzate) –

risposta

24

Ti consigliamo di utilizzare uno strumento dianalisi statica

Il Gotcha principale che ho incontrato in è che devi stare attento che tutte le librerie non vengono utilizzate da qualche parte che non c ontrollo/avere. Se elimini una funzione da una classe che viene utilizzata facendo riferimento a una libreria nel tuo progetto, puoi rompere qualcosa che non sapevi usare il codice.

0

Anche se non specificamente per codice morto, ho trovato il navigatore Fonte

http://sourcenav.berlios.de/

molto utile, anche se ingombrante per impostare e un po 'buggy. È stato un anno fa su Linux (Fedora).

2

Un approccio consiste nell'utilizzare la voce di menu di scelta rapida "Trova tutti i riferimenti" sui nomi di classi e funzioni. Se una classe/funzione è di riferimento solo in sé, è quasi sicuramente un codice morto.

Un altro approccio, basato sulla stessa idea, è quello di rimuovere (commentare) file/funzioni dal progetto e vedere quali messaggi di errore si otterranno.

+0

Questo approccio è sicuramente ** non ** applicabile a progetti di grandi dimensioni. –

3

Penso che la soluzione migliore sarebbe probabilmente uno strumento di copertura. Ce ne sono molte sia per * nix che per windows. Se hai dei test unitari, è facile: se hai una copertura di test bassa, il codice scoperto è morto o non ancora testato (vuoi comunque entrambi i pezzi di queste informazioni). Se non si dispone di test unitari, creare l'app con la strumentazione fornita da uno di questi strumenti, eseguirla attraverso alcuni (dovrebbe essere idealmente) i percorsi di esecuzione e visualizzare il report. Ottieni le stesse informazioni con i test unitari, richiederà solo molto più lavoro.

Dal momento che si sta utilizzando VisualStudio, mi potrebbe fornire paio di link che si potrebbe considerare l'utilizzo:

Nessuno di loro è libero, neppure a buon mercato , ma di solito ne vale la pena.

Su piattaforme * nix gcov accoppiate con strumenti come zcov o lcov è una scelta davvero eccezionale.

2

Niente batte la familiarità con il codice.Tranne forse potature rigorose come si va avanti.

A volte quello che sembra deadwood viene utilizzato come impalcatura per i test unitari ecc., O sembra essere vivo semplicemente perché i test di unità legacy lo esercitano, ma non viene mai esercitato al di fuori dei test. Poco fa ho rimosso più di 1000 LOC che era di supporto esterni traduttori modello CAD, abbiamo avuto le prove che invocano quei traduttori esterni ma quei traduttori era stato supportato per 8+ anni e non c'era modo che un utente dell'applicazione, anche se volevano potrebbe mai invocarli.

A meno che uno non sia rigoroso a sbarazzarsi del legno morto, si troverà la tua squadra a mantenere la roba per anni.

+0

Anche con la potatura lungo la strada, le cose scivolano attraverso le fessure - c'è ancora un ottimo caso d'uso per riuscire a trovare il codice morto a livello globale. – ideasman42

0

Vedi il nostro SD C++ Test Coverage.

È necessario eseguire molti test dinamici per esercitare il codice, per assicurarsi di raggiungere la quantità massima di copertura. Il codice "non coperto" può essere o non essere morto; forse non hai semplicemente un caso di prova per esercitarlo.

3

Caolán McNamara's callcatcher viene utilizzato molto efficacemente all'interno del progetto LibreOffice (~ 6 MLOC) per trovare il codice morto.

4

È possibile utilizzare Cppcheck per questo scopo:

$ cppcheck --enable=unusedFunction . 
Checking 2380153.c... 
1/2 files checked 0% done 
Checking main.c... 
2/2 files checked 0% done 
[2380153.c:1]: (style) The function '2380153' is never used. 
+0

Si prega di non pubblicare la stessa risposta a più domande. Se la stessa informazione risponde a entrambe le domande, allora una domanda (di solito quella più nuova) dovrebbe essere chiusa come duplicato dell'altro. Puoi indicarlo [votando per chiuderlo come duplicato] (http://stackoverflow.com/help/privileges/close-questions) o, se non hai abbastanza reputazione per quello, [alzare una bandiera] (http://stackoverflow.com/help/privileges/flag-posts) per indicare che si tratta di un duplicato. Altrimenti, assicurati di adattare la risposta a * questa * domanda e non incollare la stessa risposta in più punti. –

Problemi correlati