il codice di esempio per l'analisi statica grilletto Clang
-
27-09-2019 - |
Domanda
Mi piacerebbe vedere una piccola ma completa frammento di codice che causerà analizzatore statico di Clang a lamentarsi. La mia motivazione è per lo più che sto cercando di farlo funzionare sul mio codice PIC32, e ho bisogno di un modo per distinguere tra "tutto il codice va bene" e "non sta in realtà facendo nulla". E 'anche in parte la curiosità, dal momento che non riesco a venire con un semplice esempio me stesso.
C89 / C99 ANSI o va bene, e idealmente mi piacerebbe vederlo prendere un semplice perdita di memoria. Il mio utilizzo è
clang --analyze test.c
Soluzione
Ho trovato un "bug" nel mio codice (l'unico ;-) che fa scattare di questo, e che non viene rilevato da -Wall
. Ho cucinato giù al seguente
struct elem {
struct elem *prev;
struct elem *next;
};
#define ELEM_INITIALIZER(NAME) { .prev = &(NAME), .next = &(NAME), }
struct head {
struct elem header;
};
#define HEAD_INITIALIZER(NAME) { .header = ELEM_INITIALIZER(NAME.header) }
int main(int argc, char ** argv) {
struct head myhead = HEAD_INITIALIZER(myhead);
}
Questa è un'implementazione relativamente semplice di una lista collegata, ma questo non è importante qui. Il myhead
variabile è inutilizzata in un'applicazione senso comune del termine, ma per il compilatore viene utilizzato poiché all'interno della inizializzatore l'indirizzo di un campo è preso.
clang
analizza correttamente questo come
/tmp 11:58 <722>% clang --analyze test-clang.c
test-clang.c:25:15: warning: Value stored to 'myhead' during its initialization is never read
struct head myhead = HEAD_INITIALIZER(myhead);
^ ~~~~~~~~~~~~~~~~~~~~~~~~
1 diagnostic generated.
Edit: ho trovato un altro che rileva anche la proliferazione memoria dello stack
char const* myBuggyFunction(void) {
return (char[len + 1]){ 0 };
}
Questo non rileva gcc
, open64
o clang
con -Wall
, ma clang
con --analyze
.