2010-08-11 2 views
12

Ich würde gerne einen kleinen, aber vollständigen Codeschnipsel sehen, der den statischen Analysator von Clang stört. Meine Motivation ist hauptsächlich, dass ich versuche, es an meinem PIC32-Code zu arbeiten, und ich brauche eine Möglichkeit, zwischen "all dem Code ist in Ordnung" und "es macht eigentlich gar nichts" zu unterscheiden. Es ist auch teilweise Neugier, da ich selbst kein einfaches Beispiel vor mich habe.Beispielcode zum Auslösen des statischen Clang-Analysators

C89/ANSI oder C99 ist in Ordnung, und im Idealfall würde ich gerne ein einfaches Speicherleck erkennen. Meine Nutzung ist

clang --analyze test.c 

Antwort

11

ich einen „Bug“ in meinem Code (die einzigen ;-) gefunden, die dadurch ausgelöst wird, und dass durch -Wall nicht erkannt wird. Ich habe es auf die folgenden

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); 
} 

gekocht Dies ist eine relativ einfache Implementierung einer verketteten Liste, aber das ist hier nicht wichtig. Die Variable myhead wird in einer üblichen Anwendung des Ausdrucks nicht verwendet, aber für den Compiler wird sie verwendet, da innerhalb des Initialisierers die Adresse eines Feldes genommen wird.

clang analysiert korrekt diese 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: Dies wird nicht erkannt von gcc, open64 oder clang mit -Wall, sondern erkennt ich ein anderes gefunden, die auch Stapelspeicher Proliferations

char const* myBuggyFunction(void) { 
    return (char[len + 1]){ 0 }; 
} 

clang mit --analyze.

+0

Macht den Job, danke :) Ich muss sagen, ich kam mit den offensichtlichsten und kreativsten blutigen Speicherlecks, die ich mir ausdenken konnte, und ließ sie alle passieren. Offensichtlich weiß es genug zu wissen, dass ich es getestet habe. – detly

+0

@detly: hat Spaß gemacht, gelernt, klingelt es :) für meine Neugier was sind Lecks in einem Kontext der statischen Analyse? –

+0

Nun, ich bin nicht 100% sicher, aber ich hatte den Eindruck, dass viele statische Analyse-Tools, einschließlich Clang, potentielle Laufzeitspeicherprobleme erkennen können (zB 'p = malloc (...); p = q;') . Da könnte ich mich irren. – detly

Verwandte Themen