触发Clang静态分析器的示例代码

det*_*tly 15 c clang clang-static-analyzer

我希望看到一小段但完整的代码片段会导致Clang的静态分析器抱怨.我的动机主要是我试图让它在我的PIC32代码上工作,我需要一种方法来区分"所有代码都很好"和"它实际上没有做任何事情".这也是一种好奇心,因为我自己似乎无法想出一个简单的例子.

C89/ANSI或C99很好,理想情况下我希望看到它发现一个简单的内存泄漏.我的用法是

clang --analyze test.c
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 13

我在我的代码中找到了一个"bug"(唯一的一个;-),由此触发,并且没有被检测到-Wall.我把它煮熟到下面

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);
}
Run Code Online (Sandbox Code Playgroud)

这是链表的相对简单的实现,但这在这里并不重要.该变量myhead在该术语的常识应用中未使用,但是对于编译器,它被使用,因为在初始化器内部采用了字段的地址.

clang 正确地分析这个

/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.
Run Code Online (Sandbox Code Playgroud)

编辑:我发现另一个也检测堆栈内存扩散

char const* myBuggyFunction(void) {
  return (char[len + 1]){ 0 };
}
Run Code Online (Sandbox Code Playgroud)

这不是由检测gcc,open64clang-Wall,而是clang--analyze.