Clang Static Analyzer 没有发现最基本的问题

Clang Static Analyzer doesn't find the most basic problems

我想试试 clang 静态分析器。我在 Windows 并使用 Visual Studio 构建了 clang。好像能用,但同时又好像极其没用。

我做了一个示例文件

example.c

int main(void) 
{
    int h = 0;
    return 1/h;
}

调用scan-build gcc -c example.c没有发现错误。

example.c

int main(void) 
{
    int h;
    return 1/h;
}

调用scan-build gcc -c example.c没有发现错误。

example.c

int main(void) 
{
    return 1/0;
}

调用scan-build gcc -c example.c没有发现错误。

如果连这些最基本的错误都找不到(clang自己就能找到),静态分析器还有什么用?

我的 gcc 如果重要的话是 MinGW。我也尝试用 clang 替换,但什么也没发生。

我是不是做错了什么?

也许你做的事情不对。 比如第三个例子 Visual Studio 2015 竟然拒绝编译报错:

error C2124: divide or mod by zero.

我不认为 Clang 不能检测到类似的东西。不过,这并不重要。

我尝试使用 PVS-Studio 检查此代码,它检测到所有三个错误:

  • V609 除以零。分母 'h' == 0.MFCApplication2 mainfrm.cpp 17
  • V614 使用了未初始化的变量 'h'。 MFC应用程序2 mainfrm.cpp 23
  • V609 除以零。分母 '0' == 0。 MFCApplication2 mainfrm.cpp 28

因此,我建议您还是尝试一下。至少第三种情况应该是Clang准确找到的。 一个实用的建议是使用更强大的工具,如 PVS-Studio,进行分析。顺便说一下,他 finds errors 在 Clang 和 GCC 中。

一定要使用 build-scan -v(详细)来查看是否真的 运行 clang 检查器。 我跟着这个教程 http://web.cs.ucla.edu/~tianyi.zhang/tutorial.html 当我尝试 C++ 示例时,它没有在错误代码中显示任何错误。 -v 告诉我提供的 Makefile 已损坏 - 在我修复 clang 仍然没有检测到错误但 g++ 显示错误后。

也许他们关闭了那个特定的检查。 Clang 静态分析器 3.8 版 教程使用3.2

版本

scan-build驱动程序在进行分析时用“拦截”命令代替了编译器,因此您需要确保使用“变量”作为编译器的名称。

例如,在POSIX shell中:scan-build sh -c '${CC} "$@"' cc main.c -o main.

PowerShell 可能有类似的语法,但我不确定,DOS 命令行需要完全不同的东西。