c++ 静态代码扫描 c++如何使用sonarqube或coverity进行代码质量检查

冬伟酱_7517

冬伟酱_7517

2026-03-19

588人浏览

原创

sonarqube 正确解析 c++ 项目需通过 cmake 生成 compile_commands.json 并在 sonar-scanner 中用 sonar.cfamily.compile-commands 显式指定路径,否则扫描结果为空;同时需配置 includedirectories 避免 stl 误报。

c++ 静态代码扫描 c++如何使用sonarqube或coverity进行代码质量检查

如何让 SonarQube 正确解析 C++ 项目

SonarQube 本身不直接编译 C++,它依赖外部构建过程生成的编译数据库(compile_commands.json)或利用 sonar-cfamily 插件配合构建工具链。没这一步,扫描结果基本为空或全是“未解析”。

实操建议:

  • 用 CMake 生成 compile_commands.json:在项目根目录执行 cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .,确保该文件出现在构建目录(如 build/compile_commands.json)
  • 运行 sonar-scanner 时显式指定路径:sonar.cfamily.compile-commands 配置项必须指向该 JSON 文件,例如:sonar.cfamily.compile-commands=build/compile_commands.json
  • 避免用 make 或 ninja 直接构建后手动拼命令——SonarQube 不识别隐式规则,也不会推导头文件包含路径
  • 如果项目含多个 build 目录(如 debug/release),每次扫描前确认 JSON 文件对应的是你真正想检查的配置(比如是否启用了 -DDEBUG)

Coverity 扫描失败常见报错及绕过方法

coverity-build 报 no compilation commands found 或 unable to determine compiler 是最常卡住的地方,根本原因不是 Coverity 安装问题,而是它没捕获到实际调用的编译器命令。

实操建议:

  • 不要直接跑 make;改用 cov-build --dir cov-int make(注意 --dir 后面是目录名,不是路径),且该命令必须在 clean 状态下首次运行
  • 若用 CMake + Ninja,先 cmake -G Ninja ...,再 cov-build --dir cov-int ninja;Coverity 对 Ninja 支持比 Make 更稳定
  • 遇到 cc1plus: error: unrecognized command line option:通常是编译器版本和 Coverity 内置 parser 不匹配,临时降级使用 g++-9 或在 cov-build 后加 --compiler-gcc 显式指定
  • 扫描后 cov-analyze 报 no defects found?检查 cov-int 目录下是否有 intermediate/ 子目录和非空的 *.cpp.o 文件——没有就说明构建根本没被拦截

sonar-cfamily 和 Coverity 检查逻辑差异在哪

两者都不是简单做词法扫描。sonar-cfamily 基于 Clang AST 构建轻量级语义模型,适合 CI 快速反馈;Coverity 则做全路径符号执行,能发现更深层的资源泄漏、空指针跨函数传播等问题,但耗时高、内存大。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

  • CI 流水线里优先用 SonarQube:启用 sonar.cfamily.gcc.includeDirectories 补充系统头路径(如 /usr/include/c++/11),否则大量 STL 相关告警会误报
  • Coverity 适合 nightly 全量扫描:用 cov-analyze --all --enable-checker ALL,但要关掉 UNINIT 类低置信度检查,否则噪声太多
  • 同一段代码,SonarQube 可能标出 resource leak 在 fopen 处,Coverity 却指出是 fclose 被跳过——这不是冲突,是分析深度不同导致的关注点偏移
  • 两者都对模板实例化支持有限;遇到大量 std::vector<t></t> 相关假阳性,优先检查是否漏了 -I 路径或模板定义没被索引到

本地调试扫描失败时该看哪几个文件

别急着重装工具链。90% 的问题,答案就藏在扫描器自己生成的日志和中间产物里。

实操建议:

  • SonarQube:打开 sonar-scanner 的 -X 调试模式,重点搜 CFamilySensor 和 parse 关键字,看它是否成功加载了 compile_commands.json,以及是否抱怨某个源文件“no language detected”
  • Coverity:cov-int 目录下必看 build-log.txt(记录所有 intercepted 编译命令)和 analysis-log.txt(显示哪些文件进了分析、哪些被跳过及原因)
  • 如果某 .cpp 文件始终不进扫描范围:检查它是否被 CMake 的 add_executable 或 add_library 显式列出;Coverity 和 SonarQube 都不会处理“存在但没参与构建”的孤立文件
  • 路径含中文或空格?Coverity 会静默失败,SonarQube 可能报 Invalid argument——统一用英文路径,这是最省时间的前置条件

真正麻烦的永远不是工具装不上,而是构建过程和扫描器之间的“语义断层”:CMake 怎么传宏、交叉编译怎么配 sysroot、第三方库头文件怎么暴露……这些细节不会报错,但会让 80% 的缺陷检测失效。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2095

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3142

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1056

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3579

7

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.20

320

3

fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.30

822

9

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

969

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

2820

5

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6139

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习