代码之家  ›  专栏  ›  技术社区  ›  detly

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

  •  12
  • detly  · 技术社区  · 15 年前

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

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

    clang --analyze test.c
    
    1 回复  |  直到 15 年前
        1
  •  13
  •   Jens Gustedt    14 年前

    我在代码中发现了一个“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 .