Gestione di falsi positivi e avvisi di codice legacy nell'analisi statica del codice C ++? [chiuso]

5

Abbiamo una grande base di codice C ++ "legacy" su cui no static analisi viene eseguita al momento.

Ogni tanto, stiamo pensando di utilizzare almeno cppcheck , magari tramite Visual Lint . (Ho anche controllato brevemente i siti di Coverity o Klocwork o RedLizards / Goanna.)

Tuttavia, mi aspetto un enorme numero di avvisi trovati e probabilmente anche di falsi positivi (nel senso che l'errore in realtà non causa un errore osservabile nell'applicazione).

Semplicemente non abbiamo le risorse disponibili per affrontarle tutte al lancio di qualsiasi strumento di analisi, tanto più che vorremmo molto solo per toccare il "codice che funziona (abbastanza bene)" se noi davvero necessario.

Quindi quello che sto cercando sono esperienze e storie utente di aggiunta dell'analisi statica C ++ alle basi di codice legacy:

We had this product, consisting of xxx lines of code over zzz C++ projects and we started using static analysis tool yyy in development. Rooting out the legacy code warnings took aaa effort, (temporarily) ignoring them was hard/easy/impossible. Ignoring warnings selectively for the code base really worked well/didn't work at all. Etc.

Qualcosa di simile. Grazie!

    
posta Martin Ba 30.09.2011 - 11:05
fonte

3 risposte

6

Per ciascuno di questi strumenti è possibile selezionare le classi di avvertenze che si desidera vedere e quali eliminare.

Ho una certa esperienza con Klocwork, e la granularità delle selezioni è abbastanza buona, così come il report attuale, cioè: puoi filtrare gli errori "vecchi" e vedere solo i cambiamenti incrementali, quando si esegue lo strumento sul codice modificato. Lo trovo molto comodo e utile.

Tuttavia, un punto da prendere in considerazione:

However, I do expect a huge number of found warnings and probably also false positives (in that the error does not actually cause an observable bug in the application).

A volte, sebbene l'errore non causi un bug osservabile nell'applicazione ora , potrebbe morderti in futuro. Visto che succedeva ed era doloroso. Ignorare gli errori solo perché non causano danni visibili in questo momento non è una buona idea.

Assegna priorità e gestisci il tuo tempo, naturalmente, ma non ignorare gli errori e dimenticarli, tendono a ricordarti della loro esistenza nel momento meno appropriato.

    
risposta data 30.09.2011 - 11:44
fonte
3

Ci sono passato diversi anni fa (introducendo il lint su una base di codice legacy di 12 anni). Anche se ho finito con una travolgente ondata di errori, ho deciso di ignorare i problemi che erano più comuni (con centinaia o migliaia di istanze), e concentrato sui messaggi che si sono verificati solo un piccolo numero di volte, la mia logica è che un pelino il problema riscontrato in centinaia di posti è probabilmente innocuo (è possibile che tutti i problemi osservabili siano stati risolti, ma più probabilmente il messaggio è solo rumore), ma i problemi che ho visto raramente potrebbero essere problemi reali che non avremmo mai segnalato.

Questo ha portato alla risoluzione di alcuni problemi di boundary array e problemi di loop, quindi ho finito per disabilitare i messaggi per i problemi più comuni.

Awk e io diventammo buoni amici mentre analizzavo l'output di lanugine. Userei perl ora se dovessi farlo di nuovo.

    
risposta data 24.02.2013 - 03:47
fonte
2

Ecco alcuni studi sul rapporto costi-benefici degli strumenti di analisi statica.

link

L'essenza dello studio è che gli strumenti di analisi statica sono nello stesso ordine di grandezza del rapporto costi / benefici dell'ispezione su una base di codice stabilita. Alla fine, il costo di trovare l'errore era circa 1/2 ispezione (ma questo è ovviamente molto dipendente dal codice base) e perché hanno concluso che il costo era nello stesso ordine di grandezza).

    
risposta data 23.02.2013 - 23:35
fonte

Leggi altre domande sui tag