关于Clang Static Analyzer
Clang 静态分析器是一款源代码分析工具,可查找 C、C++ 和 Objective-C 程序中的错误。它基于符号执行技术实现了路径敏感的程序间分析。
安装
这个直接安装llvm整套就可以获得了
可以通过https://apt.llvm.org/
或者 https://mirrors.tuna.tsinghua.edu.cn/help/llvm-apt/
指引安装,但是清华的源只含64位的包,需要大约140行的REPO_NAME,在deb后面添加[arch=amd64]
,这样就只会下载64的包了
1 | root@vm:~# cat llvm.sh | grep -n 64 |
我当时安装默认安装的时llvm-18,所以我添加了bin的路径到PATH
1 | export PATH="$PATH:/usr/lib/llvm-18/bin" |
我是放在~/.bashrc
文件里面
测试
使用文件:
https://github.com/hardik05/Damn_Vulnerable_C_Program/blob/master/dvcp.c
1 | root@vm:~/cppaudit/testcode# scan-build clang -c dvcp.c |
可以看到默认是输出html报告到/tmp/scan-build-XXX
目录,我们可以使用-o进行指定目录
1 | 常用选项 |
打开html报告,比命令行的好看很多
可以看到这个比上一篇用的cppcheck查找多多了,毕竟使用了符号执行技术
官方建议
- 第一个Always Analyze a Project in its “Debug” Configuration
大多数项目都可以在启用断言的“调试”模式下构建。静态分析器会拾取断言来修剪不可行的路径,这在某些情况下可以大大减少工具发出的误报(虚假错误报告)的数量。
使用scan-build工具的–force-analyze-debug-code标志,该标志将自动启用断言。
- 调试 scan-build 时使用详细输出
scan-build 使用一个 -v 选项来输出有关它正在做什么的详细内容;两个 -v 选项会输出更多信息。将 scan-build 的输出重定向到文本文件(确保重定向标准错误)对于提交针对 scan-build 或分析器的错误报告非常有用,因为我们可以看到传递给分析器的确切选项(和文件)。要获得更易懂的日志,请不要执行并行编译。
- 通过 scan-build 运行 ‘./configure’
如果分析的项目使用 autoconf 生成的configure脚本,您可能需要通过scan-build运行configure脚本才能分析该项目。
例子
$ scan-build ./configure
$ scan-build –keep-cc makeconfigure也需要通过scan-build运行的原因是因为scan-build通过干预编译器来扫描源文件。目前,这种插入是通过scan-build临时将环境变量CC设置为ccc-analyzer来完成的。 ccc-analyzer程序就像一个假编译器,将其命令行参数转发给编译器以执行常规编译,并使用clang来执行静态分析。
假如是整个项目审计,可以
1 | scan-build make -j4 |
而对于cmake的
1 | scan-build cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. |
CodeChecker
根据llvm官方描述,CodeChecker 得到了更积极的维护,提供了与流行编译器的多个版本一起使用的启发式方法,并且它还附带了一个基于 Web 的 GUI,用于查看、过滤、分类和抑制结果。
官方安装指引:https://github.com/Ericsson/codechecker/#Install-guide
犹豫我已经装过clang了,我自己修改了下:
1 | sudo apt-get install cppcheck g++ build-essential curl gcc-multilib git python3-dev python3-venv python3-setuptools |
参考
https://clang.llvm.org/docs/ClangStaticAnalyzer.html
https://clang-analyzer.llvm.org/
https://apt.llvm.org/
https://mirrors.tuna.tsinghua.edu.cn/help/llvm-apt/
https://github.com/Ericsson/codechecker/#Install-guide