2012-08-15 13 views
7

Ho installato lo strumento Cppcheck per l'analisi del codice statico del mio progetto C++ e ho avuto la sensazione che funzioni male. Ad esempio, qualcuno può dirmi perché Cppcheck non riesce a trovare un errore di array fuori dai limiti nel seguente codice?Perché Cppcheck non trova questo ovvio errore di fuori campo?

void f(int c) { 
    char *p = new char[10]; 
    p[c] = 42; 
} 

void g() { 
    f(100); 
} 

C'è un online demo in cui questo codice può essere comodamente controllato utilizzando Cppcheck. Tutto ciò che viene fuori è una perdita di memoria alla riga 4, nessun segno di un potenziale overflow del buffer.

+2

ho notato che la tua domanda è già stato pubblicato e commentato nel forum cppcheck. Il commento sembra implicare che questo tipo di controllo dei limiti non è ancora supportato. Potrebbe essere meglio interrogarlo ulteriormente in quel forum. –

+1

perché nessuno strumento potrebbe mai trovare tutti gli errori, e specialmente cppcheck non analizza e valuta completamente C++, ma contiene molte scorciatoie che consentono di rilevare solo la maggior parte degli errori locali. – PlasmaHH

+2

Descrivere i passaggi necessari affinché lo strumento sia in grado di rilevare l'errore. Quindi elencare i casi in cui potrebbero apparire falsi positivi. Quindi provate ad immaginare gli sviluppatori seduti e valutando queste cose l'una contro l'altra. – HonkyTonk

risposta

9

Perché non è attualmente supportato.

Questo non è in realtà un errore ovvio per il compilatore. Qualcosa come

char c[5]; 
for (int i=0; i<10; ++i) 
    c[i] = 0; 

è più ovvio, in quanto è tutto nello stesso codice.

Qualcosa di simile

#define f(c) { \ 
    char *p = new char[10]; \ 
    p[c] = 42; \ 
} 

void g() { 
    f(100); 
} 

è più evidente, perché cppcheck e il compilatore espandono tutte le macro in-place prima dei controlli attuali.

Tuttavia, il codice inviato non è banale, poiché cppcheck e il compilatore richiedono l'intero codice all'interno di tale funzione e lo valutano rispetto al parametro. Naturalmente è possibile se la funzione è in vista (diventa piuttosto difficile, fino a impossibile, attraverso le unità di traduzione), ma al momento, cppcheck non ha questa caratteristica.

9

Sono uno sviluppatore di Cppcheck.

Non è in base alla progettazione che Cppcheck non riesce a rilevarlo.

Attualmente CppCheck non valuta le funzioni utilizzando tutti i parametri dati da tutte le chiamate di funzione. Abbiamo biglietti su questo e spero che verrà riparato un giorno. Sarebbe bello.

Se si utilizza Cppcheck non si dovrebbe pensare che rileverà tutti i bug. Cppcheck probabilmente non riuscirà a rilevare la maggior parte degli errori. Non c'è alcun metodo, a mio modesto parere, che rilevi tutti i bug nel tuo software. Usa Cppcheck solo per rilevare alcuni dei bug che non riesci a rilevare altrimenti. Riduce il numero di bug in qualche modo.

Spero che non siate troppo delusi e continuerete a utilizzare Cppcheck.

+3

Scusa, ma * è * di progettazione che CppCheck non riesce a rilevare il problema dell'OP. CppCheck è * progettato * per produrre un flusso di token di langauge e applicare "patterns" per controllare le sequenze di token per i problemi. Ma un tokenizzatore non ha una vera comprensione delle informazioni sul tipo nella lingua e quindi non può effettuare alcun controllo relativo al tipo. Naturalmente, con energia sufficiente, si potrebbero aggiungere tutte quelle informazioni di tipo elaborando i token, ma a quel punto si ha un front-end C++ completo e quello non sembra essere nell'ambizione di CppCheck. Questo strumento semplicemente non può andare molto lontano in analisi statiche serie. –

+3

Non sono deluso da Cppcheck, è un grande progetto open source. Non conoscevo i suoi limiti abbastanza bene. Grazie per le spiegazioni. – dokaspar

4

L'ultima versione di Cppcheck 1.70 dev è in grado di rilevare questo bug:

$ cppcheck test.cpp 
Checking test.cpp... 
[test.cpp:3]: (error) Array 'p[10]' accessed at index 100, which is out of bounds. 
[test.cpp:4]: (error) Memory leak: p 
+1

Questo esempio ha la funzione nello stesso file o funziona con la funzione in un file e la chiamata alla funzione in un altro file? –

+1

Questo è un buon punto. Secondo i miei test [qui] (https://github.com/orbitcowboy/Stackoverflow_Question_11966613), il problema di accesso al buffer fuori dai limiti viene rilevato solo da cppcheck se il codice risiede nello stesso file. – orbitcowboy

Problemi correlati