CodeChecker
CodeChecker是一个基于LLVM/Clang静态分析器工具链构建的静态分析基础设施,在Linux或macOS(OS X)开发环境中替代scan-build
。
:bulb: 查看我们的演示,展示了一些开源项目的分析结果!
主要特性
命令行C/C++分析
- 执行Clang-Tidy、Clang静态分析器(具有跨翻译单元分析功能)、统计分析(当有检查器可用时)、Cppcheck和GCC静态分析器。
- 通过监听任何构建过程(例如,
CodeChecker log -b "make"
)创建JSON编译数据库。 - 自动分析GCC交叉编译项目:检测GCC或Clang编译器配置并形成相应的clang分析器调用。
- 增量分析:只需要重新分析已更改的文件及其依赖项。
- 误报抑制,并可添加审查评论。
- 在命令行或静态HTML中可视化结果。
基于Web的报告存储
- 您可以存储和可视化数千个分析报告,包括多种分析器,如Clang静态分析器(C/C++)、Clang Tidy(C/C++)、Facebook Infer(C/C++、Java)、Clang Sanitizers(C/C++)、Spotbugs(Java)、Pylint(Python)、Eslint(Javascript)等。
完整列表请参见支持的分析器 - Web应用程序用于查看发现的代码缺陷,体验流畅简便(使用PostgreSQL或SQLite后端)。
- Gerrit和GitLab集成 将分析结果显示为GitLab或Gerrit评审。
- 可过滤(缺陷检查器名称、严重程度、源路径等)和可比较(计算项目两次分析之间的差异,显示哪些bug已修复,哪些是新引入的)的结果查看。
- **差异模式:**显示自上次分析执行以来引入的bug列表。
- 结果可与其他开发人员共享,评论和审查系统有助于沟通代码缺陷。
- 易于实现的基于Thrift的服务器-客户端通信,用于存储和查询发现的缺陷。
- 支持多种bug可视化前端,如Web应用程序、命令行工具和Eclipse插件。
命令行功能
CodeChecker
命令有许多子命令,可用于记录和分析项目、打印结果或启动Web服务器等。完整列表请参见下表或查看此命令的帮助信息(CodeChecker --help
):
CodeChecker 子命令 | 描述 |
---|---|
analyze | 对JSON编译数据库中记录的文件执行支持的代码分析器。 |
analyzer-version | 打印正在使用的CodeChecker分析器包的版本。 |
analyzers | 列出支持的和可用的分析器。 |
check | 对项目进行分析并将结果打印到标准输出。 |
checkers | 列出可用于代码分析的检查器。 |
cmd | 从命令行查看正在运行的服务器上的分析结果。 |
fixit | 根据分析器的建议应用自动修复。 |
log | 运行构建命令,收集执行的编译命令并将其存储在JSON文件中。 |
parse | 以人类可读的格式打印分析摘要和结果。 |
server | 启动和管理CodeChecker Web服务器。 |
store | 将分析结果保存到数据库。 |
version | 打印正在使用的CodeChecker包的版本。 |
web-version | 打印正在使用的CodeChecker服务器包的版本。 |
CodeChecker cmd 子命令还有许多其他子命令,可用于从运行中的CodeChecker服务器获取数据(产品、运行、结果、统计信息)。完整列表请参见下表或查看此子命令的帮助信息(CodeChecker cmd --help ): |
CodeChecker cmd 子命令 | 描述 |
---|---|
runs | 列出可用的分析运行。 |
history | 显示多个运行的历史记录。 |
results | 列出给定运行的分析结果(发现)摘要。 |
diff | 比较两次分析运行并显示差异。 |
sum | 显示检查器的统计信息。 |
token | 访问与配置CodeChecker服务器管理的个人访问令牌相关的子命令。 |
del | 删除分析运行。 |
update | 更新分析运行。 |
suppress | 管理和导入CodeChecker服务器上的报告抑制。 |
products | 访问与配置CodeChecker服务器管理的产品相关的子命令。 |
components | 访问与配置CodeChecker服务器管理的源组件相关的子命令。 |
login | 认证需要权限的CodeChecker服务器。 |
export | 从CodeChecker导出评论和审查状态。 |
import | 将评论和审查状态导入CodeChecker。 |
使用流程
- 步骤1:
CodeChecker log
运行给定的构建命令并记录执行的编译步骤。这些步骤以JSON格式写入输出文件(编译数据库)。 - 步骤2:
CodeChecker analyze
使用先前创建的JSON编译数据库对项目进行分析,输出机器可读(plist)格式的分析结果。 - 步骤3:在这一步,你可以执行多项操作:
- 解析并美化打印分析结果文件的摘要和结果(
CodeChecker parse
)。 - 将结果存储到运行中的CodeChecker服务器(
CodeChecker store
)。 - 比较两个分析结果/运行,显示两者之间的差异(
CodeChecker cmd diff
)。 - 等等。
- 解析并美化打印分析结果文件的摘要和结果(
有关如何使用CodeChecker的更多信息,请参阅我们的用户指南。
用户文档
C/C++分析
基于Web的报告管理
- Web服务器用户指南
- Web GUI用户指南
- 命令行和Web UI功能概览
- 安全配置
- 部署
- 服务器配置
- 持续集成(CI)
- 数据库配置
存储分析器工具的报告
CodeChecker可以用作可视化分析器结果的通用工具。
支持以下工具:
语言 | 分析器 |
---|---|
C/C++ | Clang 静态分析器 |
Clang Tidy | |
[Clang sanitizer](https://github.com/Ericsson/codechecker/blob/master/supported_code_analyzers.md#clang-sanitizers | |
Cppcheck | |
Facebook Infer | |
Coccinelle | |
Smatch | |
Kernel-Doc | |
Sparse | |
cpplint | |
C# | Roslynator.DotNet.Cli |
Java | SpotBugs |
Facebook Infer | |
Python | Pylint |
Pyflakes | |
JavaScript | ESLint |
TypeScript | TSLint |
Go | Golint |
Markdown | Markdownlint |
Sphinx |
常用工具
这些实用工具也可以在 CodeChecker 之外使用。
- 构建日志记录器(用于从构建中生成 JSON 编译数据库)
- Plist/Sarif 到 HTML 转换器(用于从给定的 plist 或 sarif 文件生成 HTML 文件)
- 报告转换工具(用于将其他分析器的分析结果转换为 codechecker 报告目录格式)
- 翻译单元收集器(用于收集翻译单元的源文件或获取依赖于给定头文件的源文件)
- 报告哈希生成器(用于为报告生成唯一的哈希标识符)
辅助脚本
安装指南
通过 pip
安装 CodeChecker
CodeChecker 可在 pypi 上获取, 可以使用以下命令安装:
pip3 install codechecker
注意: 此软件包可以安装在具有 pip3
命令的 Linux
、OSX
和 Windows
系统上。在 OSX
上,必须安装 intercept-build
以进行日志记录(CodeChecker log
)。在 Windows
上,
日志记录功能不可用。
通过 snap
包管理器安装 CodeChecker
CodeChecker 可在 Snap Store 上获取, 可以使用以下命令安装:
sudo snap install codechecker --classic
注意: 不幸的是,snap 包只支持小写命令名。
因此,你需要在所有地方使用 codechecker
命令而不是 CodeChecker
。
要查看 codechecker snap 包中可用命令的完整列表,请运行 snap info codechecker
。
Linux
有关详细的依赖列表以及如何安装更新版本的 Clang 和 Clang-Tidy 的说明, 请参阅 需求。 以下命令用于在 Ubuntu 20.04 LTS 上引导 CodeChecker:
# 安装开发和分析环境所需的必要依赖。
# 注意:clang 或 clang-tidy 可以是任何足够新的版本,不必来自包管理器!
# 对于 Cppcheck,最低支持版本为 1.80。
# 对于 gcc,最低支持版本为 13.0.0。
sudo apt-get install clang clang-tidy cppcheck g++ build-essential curl \
gcc-multilib git python3-dev python3-venv python3-setuptools
# 安装 web 所需的 nodejs 依赖。对于 Debian/Ubuntu,你可以使用
# 以下命令。更多信息请参见官方文档:
# https://nodejs.org/en/download/package-manager/
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs
# 检出 CodeChecker 源代码。
git clone https://github.com/Ericsson/CodeChecker.git --depth 1 ~/codechecker
cd ~/codechecker
# 创建 Python 虚拟环境并将其设置为你的环境。
# 注意:如果你想开发 CodeChecker,请使用 `venv_dev` 目标而不是 `venv`。
make venv
source $PWD/venv/bin/activate
# [可选] 如果你想使用外部身份验证方法(LDAP / PAM),
# 请按照以下说明进行操作
# docs/web/authentication.md#external-authentication-methods
# 构建并安装 CodeChecker 包。
make package
# 为了便于访问,将构建目录添加到 PATH。
export PATH="$PWD/build/CodeChecker/bin:$PATH"
cd ..
注意:
- 默认情况下,
make package
将同时构建32位和64位的ldlogger共享对象。如果您只想构建和打包64位共享对象和ldlogger二进制文件,可以在构建包之前设置BUILD_LOGGER_64_BIT_ONLY
环境变量为YES
:BUILD_LOGGER_64_BIT_ONLY=YES make package
。 - 默认情况下,如果UI代码尚未构建或发生变更,
make package
将构建UI代码。如果不想构建UI代码,可以在构建包之前设置BUILD_UI_DIST
环境变量为NO
:BUILD_UI_DIST=NO make package
。 - 使用
make standalone_package
代替make package
可以避免在运行CodeChecker之前手动激活环境。
系统或Python升级后更新环境
如果您已将系统的Python升级到更新版本(例如,从3.8
升级到3.11
- 这在将Ubuntu从20.04 LTS升级到22.04 LTS时会发生),安装的环境将无法直接使用。要解决此问题,请运行以下命令来升级您的checker_env
:
cd ~/codechecker/venv
python3 -m venv .
Mac OS X
有关Mac OS X的安装说明,请参阅Mac OS X安装指南文档。
Docker
要在Docker中运行CodeChecker服务器,请参阅Docker文档。 您可以在Docker Hub找到CodeChecker web服务器容器。
Visual Studio Code插件
您可以从Visual Studio Marketplace 或Open VSX安装并使用CodeChecker VSCode扩展。
主要功能:
- 从编辑器运行CodeChecker分析并自动查看结果。
- 保存文件时重新分析当前文件。
- 提供命令和构建任务,可将CodeChecker作为构建系统的一部分运行。
- 浏览发现的报告并直接在代码中显示复现步骤。
- 在复现步骤之间导航。
有关如何安装和使用此插件的更多信息,请参阅此扩展的仓库。
GitHub Actions CI
CodeChecker可以通过可重用的GitHub action为您的项目执行! 您只需指定构建命令,就像在本地运行分析一样。
更多信息,请查看GitHub Actions Marketplace上的 CodeChecker静态分析 action。
分析您的第一个项目
在终端中设置环境
每次在新的命令提示符中执行分析时,都必须执行这些步骤。
source ~/codechecker/venv/bin/activate
# CodeChecker包的路径
# 注意: 如果您想始终指定CodeChecker的完整路径,请跳过此行。
export PATH=~/codechecker/build/CodeChecker/bin:$PATH
# 已构建的LLVM/Clang的路径
# 注意: 如果clang作为已安装的Linux包可在您的PATH中使用,请跳过此行。
export PATH=~/<用户路径>/build/bin:$PATH
执行分析
使用check
命令分析您的项目:
CodeChecker check -b "cd ~/your-project && make clean && make" -o ./results
check
将打印分析器在您项目中发现的问题概览。报告将以plist
XML格式存储在./results
目录中。
将报告导出为静态HTML文件
您可以通过执行以下命令将结果可视化为静态HTML:
CodeChecker parse -e html ./results -o ./reports_html
将在./reports_html/index.html
中生成一个包含所有报告列表的索引页面。
可选: 将结果存储在Web服务器上并查看结果
如果您有数百个结果,您可能希望将它们存储在带有数据库后端的web服务器上。
在另一个终端或作为后台进程启动CodeChecker web和存储服务器。默认情况下,它将监听localhost:8001
。
包含报告的SQLite数据库将放置在您的工作空间目录中(默认为~/.codechecker
),可以通过-w
标志提供。
CodeChecker server
将您的分析报告存储到服务器上,以便能够使用Web查看器。
CodeChecker store ./results -n my-project
在浏览器中打开CodeChecker Web查看器,您将看到一个显示分析结果的web应用程序。
开发者文档
会议论文、演讲
-
在PLDI 2020上介绍了CodeChecker基础设施的概述。
Márton, Gábor 和 Krupp, Dániel:
工具讲解:CodeChecker -
在2015年欧洲LLVM大会的演讲中提供了该基础设施的高级概述。
Krupp, Dániel、Orbán, György、Horváth, Gábor 和 Babati, Bence:
Clang静态分析工具集的工业应用经验