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提示和代码检查.所以使用最新的检查库,可以带来更全面的检查,以提高代码质量和健壮性。

参考:

1.scan-build:从命令行运行分析器

2.llvm, clang 和 scan-build 的安装和使用

3.Clang Static Analyzer

posted @ 2020-11-06 23:25  煊奕  阅读(5553)  评论(0编辑  收藏  举报