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

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

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

clang --analyze test.c 

我在我的代码中找到了一个“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); } 

这是链表的相对简单的实现,但这在这里并不重要。 变量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. 

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

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

这不是通过gccopen64clang-Wall检测到的,而是通过open64 clang检测到的。