简介

CodeChecker是一个基于LLVM/Clang工具链的静态分析组件,用于替代Linux/MacOS开发环境中的scan-build工具。本文简单介绍其使用方法使用命令

安装

MaxOS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Download and install dependencies.
brew update
brew install doxygen gcc git
pip3 install virtualenv

# Install the latest clang see: https://formulae.brew.sh/formula/llvm
brew install llvm@7

# Fetch source code.
git clone https://github.com/Ericsson/CodeChecker.git --depth 1 ~/codechecker
cd ~/codechecker

# Create a Python virtualenv and set it as your environment.
make venv_osx
source $PWD/venv/bin/activate

# Build and install a CodeChecker package.
make package

# For ease of access, add the build directory to PATH.
export PATH="$PWD/build/CodeChecker/bin:$PATH"

cd ..

make package时,会报出各种错误,这是因为缺少python依赖包:

  • sqlalchemy
  • pysocks
  • portalocker
  • alembic
  • pg8000
  • psycopg2-binary
  • psutil
  • scan-build
  • thrift
  • codechecker_api
  • codechecker_api_shared

使用pip进行安装:

1
$ pip install package_name

使用

详细介绍见CodeChecker使用介绍

生成编译数据库文件

创建一个目录,用来进行编译(我们这里用tmux目录):

1
2
cd tmux
./configure

清理之前的编译结果:

1
make clean

通过拦截记录make的执行,生成编译数据库文件:

1
CodeChecker log -b "make" -o compilation.json

检测生成的compilation.json。如果包含gcc的编译过程,那么这个编译数据库文件就是正常的。

1
vim ./compilation.json

如果编译数据库文件是空的,有以下原因:

  • Make sure that your build system actually invoked the compiler (e.g. gcc, g++). In case your software was built once (and the binaries are already generated), the compiler will not be invoked. In this case do a build cleanup (e.g. make clean) and retry to log your build.
  • Make sure that the CC_LOGGER_GCC_LIKE environment variable is set correctly and contains your compilers. For detailed description see the user guide.
  • MacOS users need intercept-build to be available on the system, and in most cases, System Integrity Protection needs to be turned off. See the README for details. It is possible that the intercept-build can not log the compiler calls without turning off System Integrity Protection (SIP). intercept build can automatically detect if SIP is turned off.

根据编译数据库文件进行分析

生成了编译数据库文件(compilation.json)后,可以开始分析对应工程。

开始分析:

1
$ CodeChecker analyze compilation.json -o ./reports

生成.plist分析结果:

1
$ CodeChecker parse ./reports

简洁操作

我们也可以将生成编译数据库文件根据编译数据库文件进行分析两步整合成一步:

1
2
3
cd tmux
make clean
CodeChecker check -b "make" -o ./reports

也可以多线程运行codechecker:

1
CodeChecker check -j22 -b "make clean;make -j22" -o ./reports

查看错误报告

命令行查看

我们可以通过命令行打印具体的分析结果(包括控制流):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CodeChecker parse --print-steps ./reports
...

Found no defects in grid-view.c
[MEDIUM] /home/ednikru/work/codechecker/play/tmux/log.c:89:1: Opened File never closed. Potential Resource leak [alpha.unix.Stream]
}
^
Report hash: 88d734fc6eeb71dd292863f2674c370a
Steps:
1, log.c:80:6: Assuming 'log_level' is equal to 0
2, log.c:89:1: Opened File never closed. Potential Resource leak

Found 1 defect(s) in log.c

...

HTML查看

我们也可以生成HTML格式的错误报告:

1
2
3
4
CodeChecker parse ./reports -e html -o ./reports_html
...
To view the results in a browser run:
> firefox ./reports_html/index.html

./reports_html 目录中将生成index.html,是所有错误报告的目录文件,可以通过它查看其他错误报告。

整合分析结果

可以将分析结果存入一个数据库,然后通过一个网页来查看所有分析结果。

  1. 在端口8555开启CodeChecker本地服务器(使用了SQLite DB,不推荐多用户使用),创建一个工作目录,然后在这个工作目录中存储数据。
1
2
mkdir ./ws
CodeChecker server -w ./ws -v 8555

默认情况下,将创建一个Default项目,来存储分析结果。

  1. 通过tmux将所有结果存储在服务器中(在Default项目中):
1
CodeChecker store ./reports --name tmux --url http://localhost:8555/Default

PRODUCT_URL 的格式为[http[s]://]host:port/ProductEndpoint。要注意的是如果我们使用安全模式(使用SSL)开启这个服务,需要使用https协议前缀(默认协议为http)。用户指南中对PRODUCT_URL进行了更为详细的介绍。

  1. 通过网址http://localhost:8555/Default查看所有的分析结果。