我希望看到一小段但完整的代码片段,这会导致Clang的静态分析器抱怨。我的动机主要是我试图让它在我的PIC32代码上工作,我需要一种方法来区分“所有代码都很好”和“它实际上没有做任何事情”。这也是一种好奇心,因为我自己似乎无法想出一个简单的例子。
C89 / ANSI或C99很好,理想情况下我希望看到它发现一个简单的内存泄漏。我的用法是
clang --analyze test.c
答案 0 :(得分:12)
我在我的代码中发现了一个“错误”(唯一的一个;-),由此触发,-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 };
}
gcc
,open64
或clang
-Wall
未检测到clang
,而--analyze
{{1}}未检测到此内容。