当前位置: 首页 > 知识库问答 >
问题:

扫描构建不会检测到任何错误

谷梁昊空
2023-03-14

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

#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)来检测错误。当我直接在文件上运行该工具时,例如使用以下命令:

扫描构建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号发出警告。扫描构建:发现1个错误。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:使用 '/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',因为它不包含任何报告。扫描构建:未发现错误。

我在 C 和 C 文件中观察到相同的行为。我看到有人在过去(2012 年)遇到过类似的错误,但是提出的答案似乎不起作用,似乎只引用 C 文件。有什么线索吗?

共有1个答案

袁青青
2023-03-14

< code>scan-build通过替换< code>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.
 类似资料:
  • 问题内容: 我在将任何内核模块构建到我的机器上时遇到问题。每当我构建模块时,modpost总是说模块为零: 为了解决该问题,我编写了一个测试模块(hello.c): 这是模块的Makefile: 在计算机上构建它时,得到以下输出: 当我在另一台机器上制作模块时,它成功了: 我寻找了有关modpost的任何相关文档,但收效甚微。任何人都知道modpost如何决定要构建什么?我可能会缺少一个环境吗?

  • 我对的体验非常糟糕,因为我使用的是和。所以我不能做扫描仪的程序。我是新手,所以请帮助我,“找不到”。这是我到目前为止的代码。

  • 上下文: SBT 0.13.0,Scala 2.10.4 由于外部约束,我需要一个自定义目录结构,所以我在test中使用 获取所有测试源并成功编译它们(我可以添加语法错误并导致构建失败) 报告有0个套件、0个测试,并且全部成功 该目录中有几个JUnit风格的scalatest测试 你知道为什么它不接受任何测试吗?我是不是错过了一个场景?还显示空列表。

  • 我制作了一个android应用程序来扫描蓝牙设备,并向我的服务器发送一个HTTP请求,这样我就可以检测它们是开着还是关着。我已经用我的带有蓝牙适配器的台式电脑测试过了,效果很好。当检测到电脑上的蓝牙功能时,它显示电脑是打开的,当我关闭电脑上的蓝牙功能时,它是关闭的。现在,我需要使用这个应用程序的设备有:雅伯投影仪、Bose SoundLink和JBL耳机,但我遇到了一些问题。 首先,投影仪似乎无法

  • 问题内容: 我正在开发游戏,但扫描仪遇到了一个小问题。我收到了一个从未关闭过的资源泄漏扫描程序。 但是我认为我的扫描仪在没有关闭之前就可以正常工作。但是现在不是。有人可以帮我吗? 问题答案: 我假设您正在使用Java 7,因此会收到编译器警告,当您不关闭资源时,通常应在finally块中关闭扫描程序。 甚至更好:使用新的 Try with resource语句 :

  • 我有两个。NET解决方案,一个在。NET5中,另一个在。NET Classic 4.7.2中。每个解决方案都有单独的Jenkins构建作业。每个工作还使用Sonarqube的MSBuild扫描器分析解决方案。 我正在使用SonarQube服务器8.5版 .NET扫描程序5 .NET扫描程序4.7.2 在Jenkins中,当.NET 5构建运行时,发出 ,同时如果我执行另一个.NET经典构建,则后一