目录

「Coverity」我看看还有谁没在位子上坐好

记录并整理 Coverity 在实践中的配置及使用技巧。

介绍

CoverityBlack Duck公司开发的一款快速、准确且高度可扩展的静态分析(SAST) 解决方案。

安装

Coverity 本身是收费软件,一般需要通过公司途径获取证书。

我们公司有在专用服务器部署扫描服务,并可将扫描结果上传到服务端进行统一管理,但对于团队内部一些开发不够灵活,且非常耗时。因此我计划在内部服务器部署一套本地扫描方案,并且不上传最终结果,只在本地将扫描结果转为 SARIF 格式并直接搭配 VSCode 进行缺陷修复。

  1. 登录安波福 Coverity,依次进入 Help -> Downloads
  2. Tools 栏目下载合适的安装包和证书文件,以 cov-analysis-linux64-2025.12.0.tar.gzlicense.dat 为例
  3. 将安装包解压到合适的目录,如 /opt/coverity
  4. license.dat 拷贝到解压后的目录的 bin 目录,如 /opt/coverity/cov-analysis-linux64-2025.12.0/bin/

至此 Coverity 的本地扫描环境部署完成。

配置

编译器配置

注册编译器类型

这步配置是告诉 Coverity 这些编译器分别是什么类型。比如 ccgcc 类型,而 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