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 命令行需要完全不同的东西。
我想试试 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 命令行需要完全不同的东西。