Clang Static Analyzer - 静态代码分析工具
作者:互联网
Clang Static Analyzer - 静态代码分析工具
LLVM不仅仅是一个编译器,同时提供了模块化的功能和库,用于编译器的开发和功能扩展。常规的一个编译器分为前端、优化器和后端,LLVM编译器也不例外,Clang就是属于一个编译器的前端部分,LLVM属于优化器和后端,当然LLVM也可以支持其他类型的前端,比如GCC前端编译器。
基础扩展
1.传统编译器是一个三层模型结构,包括前端编译器、优化器、后端编译器。
- 前端主要负责源代码的编译解析、错误检查以及生成抽象语法树。
- 优化器主要负责对语法树的优化,以提高代码的运行时间,比如消除冗余计算等。
- 后端主要负责将优化后的中间代码转成机器码,这个阶段会针对不同的机器架构、指令集优化以提高代码的执行性能。
2.LLVM是Low Level Virtual Machine的首字母缩写。 本来是一个低级别的虚拟机,但现在它是一种编译器的基础程序集合,包括一些LLVM中介码、LLVM除错工具等,它利用虚拟技术(中介码)为开发语言的编译期、链接期、运行期以及闲置期提供了优化和改良。
3.Clang是一个前端编译器,Clang只支持C家族的三门语言C、C++和Objective-C,相比于GCC,Clang的优势在于速度快、内存占用体积小、模块化、诊断信息可读性强、设计清晰扩展性强等。
4.静态检查工具说明
- scan-build: 运行分析器的高级命令行工具。
- scan-view: 查看
scan-build
生成的分析结果。
clang安装
1.apt安装
sudo apt-get install clang
sudo apt-get install llvm
注意:如果这样安装完成后执行scan-build提示没有此命令,需要单独将scan-build安装或改用下面两种方式安装。
2.官网下载整包安装
在llvm的官网 可以查看已经编译好的各个平台的release版本,Clang也会作为llvm release的一部分一起发布
3.源码编译安装
参考官网 上的步骤,下载源码后配置一下cmake,编译、安装即可。
可以先安装一些可能用到的工具:
sudo apt install gcc
sudo apt install g++
sudo apt install make
sudo apt install cmake
使用
static analyzer
的实质是提供了一个fake compiler
,在真正的compile
完成之后,进行analyzer
1.安装好后, make 之前加上 scan-build 就可以了。
scan-build --use-analyzer `which clang` make
- scan-build 需要指定 clang 的路径。所以需要设置
--use-analyzer
。 - 使用
-o
选项,可以指定输出报告的存放位置。默认是/tmp
目录下。
2.结合autoconf,cmake等工具扫描实际项目
scan-build ./configure
scan-build make
cmake -DCMAKE_C_COMPILER=ccc-analyzer -DCMAKE_CXX_COMPILER=c++-analyzer ..
3.checker-检查规则
内置的 checker 存放在 ../llvm/tools/clang/lib/StaticAnalyzer/Checkers
目录下。 这些 checker默认情况下并没有全部开启,所以需要根据情况启用合适的 checker。可以使用-enable-checker
和-disable-checker
开启和禁用具体的 checker 或者某种类别的 checker。
如:
scan-build -enable-checker alpha.security.ArrayBoundV2 ... # 启用数组边界检查
4.相关参数
$scan-build
usage: scan-build [-h] [--verbose] [--override-compiler] [--use-cc <path>]
[--use-c++ <path>] [--intercept-first] [--status-bugs]
[--exclude <directory>] [--output <path>] [--keep-empty]
[--html-title <title>] [--plist | --plist-html]
[--use-analyzer <path>] [--no-failure-reports]
[--analyze-headers] [--stats] [--internal-stats]
[--maxloop <loop count>] [--store <model>]
[--constraints <model>] [--analyzer-config <options>]
[--force-analyze-debug-code]
[--load-plugin <plugin library>]
[--enable-checker <checker name>]
[--disable-checker <checker name>] [--help-checkers]
[--help-checkers-verbose]
...
scan-build: error: missing build command
查看结果
1.若代码存在问题,会生成html报告,否则不生成。
2.生成成功后,可在浏览器直接打开查看,也可以使用scan-view命令进行查看。
3.生成位置若不指定则在/tmp
下。
静态检查知识补充
使用静态分析库有几个注意点:
- 持续更新,不断优化
代码检查库一直计划提升代码检查的精确度和范围,优化查找bug的方式,对于静态代码检查有一些基本的限制,可优化的空间还有很大. - 比编译耗时
使用静态代码检查自动查找程序bug其实是使用CPU时间来换更高的代码质量.静态分析要比编译耗时.
即使Clang
在速度和轻量级上尽可能进行了优化,但是也不要期待会比项目编译更快.一些用于查找bug的代码最差时需要指数级的时间消耗. - 检测失误
静态检测并不是完美的,可能正确的代码也会出现一些错误的bug提示,因为不同代码需要的检查精度不同,我不同的检查规则中,可能会出现不同频率的检测失误,Clang
一直在尽力减少这种失误,但目前并没有完全避免. - 并未100%覆盖全部bug
静态检查只是找到了那写常见的特定bug,但是对于某些bug还未覆盖.
常见问题
1.Clang
开源的代码检查库更新比较频繁,会有更多的bug提示和代码检查.所以使用最新的检查库,可以带来更全面的检查,以提高代码质量和健壮性。
参考:
2.llvm, clang 和 scan-build 的安装和使用
标签:scan,--,checker,Clang,编译器,Analyzer,Static,build 来源: https://www.cnblogs.com/clwsec/p/13939488.html