18

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

C89/ANSI 或 C99 很好,理想情况下我希望看到它能够解决简单的内存泄漏问题。我的用法是

clang --analyze test.c
4

1 回答 1

14

我在我的代码中发现了一个“错误”(唯一一个 ;-),它会触发它,而-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 };
}

这不是由或with检测到的gcc,而是由with检测到的。open64clang-Wallclang--analyze

于 2010-08-15T10:06:40.993 回答