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

标签 c clang clang-static-analyzer

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

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

clang --analyze test.c

最佳答案

我在我的代码中发现了一个“错误”(唯一的一个 ;-),它触发了这个错误,而 -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 with -Wall 检测不到,但 clang--analyze

关于c - 触发 Clang 静态分析器的示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3455157/

相关文章:

c - 奇怪的寄存器定义、声明和使用

c - 在同一程序中使用 mmap 和 malloc 分配内存是否安全?

objective-c - 如何在 Cocoa 应用程序中解析 Objective-C 代码

c++ - 在 msvc 上编译的模板成员函数特化的情况,而不是其他

铿锵错误: linker command failed with exit code 1104

使用arm作为目标进行clang-check

c - C中http header 的正则表达式

c - 海湾合作委员会警告: assignment makes integer from pointer without a cast

c - 真正的泄漏还是错误的分析仪报告?

ios - ios/objective c 中的内存泄漏问题