Probabilmente avrete a che fare con una buona quantità di falsi positivi, in particolare se il vostro codice base è grande.
La maggior parte degli strumenti di analisi statica funzionano utilizzando "analisi intra-procedurali", il che significa che considerano ogni procedura separatamente, al contrario di "analisi dell'intero programma" che considera l'intero programma.
Generalmente utilizzano l'analisi "intra-procedurale" perché "l'analisi dell'intero programma" deve considerare molti percorsi attraverso un programma che in realtà non si verificherà mai nella pratica, e quindi può spesso generare risultati falsamente positivi.
L'analisi intra-procedurale elimina tali problemi semplicemente concentrandosi su una singola procedura. Per funzionare, tuttavia, di solito è necessario introdurre un "linguaggio di annotazione" che si usa per descrivere i metadati per gli argomenti della procedura, i tipi di ritorno e i campi dell'oggetto. Per C++ queste cose sono solitamente implementate tramite macro con cui decorare le cose. Le annotazioni quindi descrivono cose come "questo campo non è mai nullo", "questo buffer di stringa è protetto da questo valore intero", "questo campo è accessibile solo dal thread etichettato 'background'", ecc.
L'analisi lo strumento prenderà quindi le annotazioni fornite e verificherà che il codice che hai scritto sia effettivamente conforme alle annotazioni. Ad esempio, se si può potenzialmente passare un valore nullo a qualcosa che è contrassegnato come non nullo, verrà contrassegnato un errore.
In assenza di annotazioni, lo strumento deve assumere il peggio e pertanto segnalerà molti errori che non sono realmente errori.
Poiché sembra che non si stia già utilizzando uno strumento del genere, si dovrebbe presupporre che si debba passare molto tempo ad annotare il codice per eliminare tutti i falsi positivi che verranno inizialmente segnalati. Vorrei eseguire inizialmente lo strumento e contare il numero di errori. Questo dovrebbe darti una stima di quanto tempo hai bisogno di adottarlo nella tua base di codice.
Se lo strumento vale o meno dipende dalla vostra organizzazione. Quali sono i tipi di bug che sei più matto? Sono buffer di sovraccarico? Sono errori di dereferenziazione o di perdita di memoria? Sono problemi di threading? Sono "oops che non abbiamo considerato questo scenario", o "non abbiamo testato una versione cinese del nostro prodotto in esecuzione su una versione lituana di Windows 98?".
Una volta individuati i problemi, è necessario sapere se ne vale la pena.
Lo strumento probabilmente aiuterà con buffer overflow, dereference nullo e bug di perdita di memoria. C'è una possibilità che possa essere d'aiuto con il threading di bug se supporta l'analisi "colorazione del filo", "effetti" o "permessi". Tuttavia, questi tipi di analisi sono piuttosto all'avanguardia e hanno ENORMI oneri notazionali, quindi arrivano con qualche spesa. Lo strumento probabilmente non aiuterà con nessun altro tipo di bug.
Quindi, dipende davvero dal tipo di software che si scrive e dal tipo di bug che si esegue più frequentemente.
John Carmack ha recentemente scritto su questo: http://altdevblogaday.com/2011/12/24/static-code-analysis/ –
John Carmack. Analisi del codice statico. Nuovo collegamento: http://www.viva64.com/en/a/0087/ –
@DavidNorman: eseguono tutti i file solo in base all'analisi dei file, quindi se si desidera analizzare come le funzioni interagiscono tra i file di origine, è necessario assumere diversi popoli * (dal momento che quegli strumenti non sono in grado di eseguire l'intera analisi del programma) *. – user2284570