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
È stato utile?

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.

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