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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top