scan-build make不会检测到任何错误

时间:2016-07-11 13:29:52

标签: c makefile clang static-analysis scan-build

我有一个非常简单的.c文件,里面有一些明显的错误。

#include <stdio.h>

struct S {
  int x;
};

void f(struct S s){
}

void test() {
  struct S s;
  f(s); // warn
}

int test2(int x){
  return 5/(x-x); // warn
}

int main(){
  test();
  test2(532);
  printf("Hej\r\r");
}

我正在尝试使用clang的静态代码分析工具(scan-build)来检测错误。当我直接在文件上运行该工具时,例如使用以下命令:

  

scan-build g ++ -o 1 1.c

我确实获得了预期的输出,包括来自编译器的警告,该警告提到除以0。

  

scan-build:使用'/usr/lib/llvm-3.8/bin/clang'进行静态分析

     

1.c:在函数'int test2(int)'中:   1.c:16:11:警告:除零[-Wdiv-by-zero]返回5 /(x-x);              ^

     

1.c:16:11:警告:除以零返回5 /(x-x);

     

〜^ ~~~~~ 1生成警告。 scan-build:找到1个bug。 scan-build:运行'scan-view / tmp / scan-build-2016-07-11-152043-3028-1'来检查错误报告。

现在,我试图将该命令放入一个非常简单的Makefile中。我的Makefile的内容是:

all: 1.c
    g++ -o 1 1.c
clean:
    rm -f *.o 1

但是,每当我使用make运行scan-build时,使用以下命令:

  

scan-build make

我仍然收到编译器的警告,但不是扫描构建工具!!!

  

scan-build:使用'/usr/lib/llvm-3.8/bin/clang'进行静态分析

     

g ++ -o 1 1.c

     

1.c:在函数'int test2(int)'中:

     

1.c:16:11:警告:除零[-Wdiv-by-zero]返回5 /(x-x);

     

^ scan-build:删除目录'/ tmp / scan-build-2016-07-11-152326-3055-1',因为它不包含任何报告。 scan-build:找不到错误。

我在C和C ++文件中都观察到了相同的行为。我看到有人在过去(2012年)遇到了similar error,但是建议的答案似乎不起作用,而且似乎只是指C ++文件。有线索吗?

1 个答案:

答案 0 :(得分:5)

scan-build通过替换CC变量来工作。在你的makefile中使用它

CC=g++
all: 1.c
        $(CC) -o 1 1.c
clean:
        rm -f *.o 1

并且有效

scan-build: Using '/usr/bin/clang' for static analysis
/usr/share/clang/scan-build/ccc-analyzer -o 1 1.c
1.c:16:17: warning: Division by zero
        return 5/(x-x); // warn
           ~^~~~~~
1 warning generated.
scan-build: 1 bugs found.
scan-build: Run 'scan-view /tmp/scan-build-2016-07-11-160529-5951-1' to  examine bug reports.