我在代码中发现了一个“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 };
}
gcc
,
open64
或
叮当声
,但是
叮当声
--analyze
.