SonarQube 6.3.1版本下如何扫描gcno文件获取C文件代码覆盖率?
SonarQube 6.3.1 处理C代码覆盖率(基于gcno文件)的方案解析
嘿,针对你用SonarQube 6.3.1获取C文件代码覆盖率的需求,我来给你梳理清楚核心问题:
先给结论:gcno转gcov再上传是当前版本的最优方案
SonarQube 6.3.1搭配的SonarCFamily插件(当时的C/C++支持插件)并不直接解析gcno文件,它依赖gcov生成的.gcov文件来提取覆盖率数据。所以把gcno(编译生成的结构信息文件)配合gcda(测试运行后生成的执行数据文件)转换为gcov文件,再提交给SonarQube,是官方认可的标准流程,也是这个版本下最稳妥、最可靠的方案,完全称得上最优选择。
具体操作的关键步骤
- 编译阶段:生成gcno文件
编译C代码时必须添加GCC的覆盖率编译参数:-fprofile-arcs -ftest-coverage,这样编译完成后会在编译输出目录生成对应的.gcno文件,它记录了代码的分支、函数等结构信息。 - 测试运行:生成gcda文件
执行你的测试用例或程序,运行完成后会在相同目录生成.gcda文件,它记录了代码实际被执行的次数、分支跳转情况等数据。 - 转换生成gcov文件
使用gcov命令将对应的.gcno和.gcda转换为SonarQube能识别的.gcov文件,示例命令如下:
注意要指定gcno/gcda所在的目录,确保gcov能正确关联到对应的编译文件。# 假设gcno/gcda在build目录下,源文件是src/main.c gcov -o ./build src/main.c - SonarQube扫描配置
在你的sonar-project.properties配置文件中,添加gcov文件的路径配置:
之后执行sonar.cfamily.gcov.reportsPath=./path/to/gcov/filessonar-scanner命令启动扫描即可,SonarQube会自动读取gcov文件并展示覆盖率数据。
有没有其他替代方案?
在6.3.1这个版本里,几乎没有更优的替代方式。后续更高版本的SonarCFamily插件支持直接解析lcov格式的报表(可以用gcovr或lcov工具把gcno/gcda转成lcov文件),但6.3.1版本还不支持这种方式,所以老老实实走gcov转换的流程是最靠谱的。
几个要注意的细节
- 确保使用的gcov版本和编译代码的GCC版本完全一致,版本不匹配可能导致gcov无法正确解析gcno/gcda文件。
- 生成的gcov文件要和源代码的路径对应准确,SonarQube需要匹配到对应的源文件才能正确展示覆盖率数据。
- 扫描前要确认所有需要的gcov文件都已生成,并且配置的路径正确,否则SonarQube会无法读取覆盖率信息。
内容的提问来源于stack exchange,提问作者Chen Ben Ezra
相关产品推荐
相关产品推荐

