Beispiel Code-Trigger Clang statische Analyse
-
27-09-2019 - |
Frage
würde Ich mag einen kleinen, aber kompletten Code-Snippet, um zu sehen, den Clang statische Analyzer verursacht zu beschweren. Meine Motivation ist vor allem, dass ich versuche es auf meinem PIC32 Code zur Arbeit zu kommen, und ich brauche einen Weg, zu unterscheiden zwischen „den gesamten Code ist in Ordnung“ und „es ist nicht wirklich etwas zu tun“. Es ist zum Teil auch Neugier, da kann ich mich nicht mit einem einfachen Beispiel zu kommen scheinen.
C89 / ANSI oder C99 ist in Ordnung, und im Idealfall würde Ich mag es zu sehen, eine einfache Speicherleck abholen. Meine Anwendung ist
clang --analyze test.c
Lösung
Ich fand einen „Bug“ in meinem Code (die einzige ;-), dass Trigger durch das, und das wird nicht durch -Wall
erkannt. Ich kann es gekocht folgenden unten
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);
}
Dies ist eine relativ einfach Implementierung einer verketteten Liste, aber das ist hier nicht wichtig. Die Variable myhead
ist ungenutzt in einem gesunden Menschenverstand Anwendung des Begriffs, sondern für den Compiler ist es, da innerhalb der Initialisierer die Adresse eines Feldes verwendet wird, genommen.
clang
Analysen richtig dies als
/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: Ich fand einen anderen, der auch Stapelspeicher Proliferation erkennt
char const* myBuggyFunction(void) {
return (char[len + 1]){ 0 };
}
Dies wird nicht erkannt von gcc
, open64
oder clang
mit -Wall
, sondern durch clang
mit --analyze
.