「Coverity」我看看还有谁没在位子上坐好
目录
记录并整理 Coverity 在实践中的配置及使用技巧。
介绍
Coverity 是 Black Duck公司开发的一款快速、准确且高度可扩展的静态分析(SAST) 解决方案。
安装
Coverity 本身是收费软件,一般需要通过公司途径获取证书。
我们公司有在专用服务器部署扫描服务,并可将扫描结果上传到服务端进行统一管理,但对于团队内部一些开发不够灵活,且非常耗时。因此我计划在内部服务器部署一套本地扫描方案,并且不上传最终结果,只在本地将扫描结果转为 SARIF 格式并直接搭配 VSCode 进行缺陷修复。
- 登录安波福
Coverity,依次进入Help->Downloads - 在
Tools栏目下载合适的安装包和证书文件,以cov-analysis-linux64-2025.12.0.tar.gz和license.dat为例 - 将安装包解压到合适的目录,如
/opt/coverity - 将
license.dat拷贝到解压后的目录的bin目录,如/opt/coverity/cov-analysis-linux64-2025.12.0/bin/
至此 Coverity 的本地扫描环境部署完成。
配置
编译器配置
注册编译器类型
这步配置是告诉 Coverity 这些编译器分别是什么类型。比如 cc 是 gcc 类型,而 clang++ 是 clangcxx 类型。
"$COVERITY_HOME/bin/cov-configure" --compiler cc --comptype gcc > /dev/null 2>&1
"$COVERITY_HOME/bin/cov-configure" --compiler c++ --comptype g++ > /dev/null 2>&1
"$COVERITY_HOME/bin/cov-configure" --compiler clang --comptype clangcc > /dev/null 2>&1
"$COVERITY_HOME/bin/cov-configure" --compiler clang++ --comptype clangcxx > /dev/null 2>&1注册编译器参数
对于 Coverity 不能自动识别的标准参数,需要补充注册。这取决于 Coverity 的版本,越新的版本理论上能自动识别的参数越多,需要具体分析。
实践中,我发现某个仓库的扫描报告中只有少量的缺陷,且都聚集在少量 c 源文件,这不合理。
通过检查构建日志(如 utils/coverity/cov-int/build-log.txt),看到其末尾摘要内容
[WARNING] Emitted 1 C/C++ compilation units (0%) successfully其成功率远低于 $100%$ ,说明大量文件被跳过了。再看构建指标(如 utils/coverity/cov-int/BUILD.metrics.xml),其中
<name>failures</name><value>191</value>
<name>successes</name><value>1</value>也得到了印证。
回到构建日志中搜索 [ERROR]
grep "\[ERROR\]" utils/coverity/cov-int/build-log.txt看看错误消息有没有什么进一步提示,比如
[ERROR] This /usr/bin/c++ compiler command specifies the following arguments which should be marked as required in your configuration:
-fPIC -std=gnu++20 -fPIC
Please reconfigure this compiler as follows:
cov-configure -co /usr/bin/c++ -- -fPIC -std=gnu++20 -fPIC因此,只要在配置时补充如下注册内容即可。
"$COVERITY_HOME/bin/cov-configure" -co /usr/bin/c++ -- -fPIC -std=gnu++20 > /dev/null 2>&1
"$COVERITY_HOME/bin/cov-configure" -co /usr/bin/g++ -- -fPIC -std=gnu++20 > /dev/null 2>&1
"$COVERITY_HOME/bin/cov-configure" -co /usr/bin/cc -- -fPIC > /dev/null 2>&1
"$COVERITY_HOME/bin/cov-configure" -co /usr/bin/gcc -- -fPIC > /dev/null 2>&1