Domanda

Sfondo

Ho un'applicazione scritta in C ++ nativo nel corso di diversi anni che è di circa 60 KLOC. Ci sono molte funzioni e classi che sono morte (probabilmente il 10-15% come la simile domanda basata su Unix di seguito). Di recente abbiamo iniziato a fare test unitari su tutto il nuovo codice e ad applicarlo al codice modificato quando possibile. Tuttavia, farei un SWAG che al momento abbiamo una copertura di test inferiore al 5%.

Assunzioni / Vincoli

Il metodo e / o gli strumenti devono supportare:

  • C ++ nativo (ovvero non gestito)
  • Windows XP
  • Visual Studio 2005
  • Non è necessario richiedere casi di test forniti dall'utente per la copertura. (ad es. non può dipendere dai test unitari per generare la copertura del codice)

Se i metodi supportano più di questi requisiti, allora ottimo.

NOTA: attualmente utilizziamo l'edizione Professional di Visual Studio 2005, non il Team System. Pertanto, l'utilizzo di Team System potrebbe essere un suggerimento valido (non lo so, non l'ho mai usato) ma spero che non sia la soluzione solo .

Perché l'uso dei test unitari per la copertura del codice è problematico

Credo che sia impossibile per uno strumento generico trovare tutti i morti (ad es. codice irraggiungibile) in qualsiasi applicazione arbitraria con zero falsi positivi (penso che questo sarebbe equivalente al problema di Halting). Tuttavia, credo anche che sia possibile per uno strumento generico trovare molti tipi di codice morto che sono altamente probabili in realtà essere morti, come le classi o le funzioni che non fanno mai riferimento nel codice da nient'altro.

Utilizzando i test unitari per fornire questa copertura, non si utilizza più un algoritmo generico e si aumenta così sia la percentuale di codice morto che è possibile rilevare sia la probabilità che eventuali hit non siano falsi positivi. Al contrario, l'uso dei test unitari potrebbe comportare falsi negativi poiché i test unitari stessi potrebbero essere l'unica cosa che esercita un determinato codice. Idealmente, avrei un test di regressione che esercita tutti i metodi disponibili esternamente, le API, i controlli utente, ecc. Che servirebbero da misurazione di base dell'analisi della copertura del codice per escludere alcuni metodi dall'essere falsi positivi. Purtroppo, al momento non ho questo test automatizzato.

Dato che ho una base di codice così ampia con una percentuale di copertura dei casi di test così bassa, sto cercando qualcosa che possa aiutare senza richiedere enormi quantità di tempo investito nella scrittura di casi di test.

Domanda

Come si fa a rilevare il codice morto in modo automatizzato o semi-automatizzato in un'applicazione C ++ nativa sulla piattaforma Windows con l'ambiente di sviluppo di Visual Studio 2005?

Vedi anche

Rilevamento del codice morto nel progetto C / C ++ legacy Voglio dirlo al Compilatore VC ++ per compilare tutto il codice. Può essere fatto?

È stato utile?

Soluzione

Chiedi al linker di rimuovere gli oggetti senza riferimento (/ OPT: REF). Se si utilizza il collegamento a livello di funzione e l'output dettagliato del linker, l'output del linker elencherà ogni funzione che può dimostrare non utilizzata. Questo elenco potrebbe essere tutt'altro che completo, ma hai già gli strumenti necessari.

Altri suggerimenti

Utilizziamo Bullseye e posso consigliarlo. Non deve essere eseguito da un ambiente di unit test, anche se è quello che facciamo.

Utilizza uno strumento di copertura del codice per la tua suite di test unitari.

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