首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gcovr/SonarQube说简单的C++函数只覆盖了一半

gcovr/SonarQube说简单的C++函数只覆盖了一半
EN

Stack Overflow用户
提问于 2020-09-23 07:50:03
回答 1查看 883关注 0票数 1

我们在代码库上运行gcovr,这是(FTR),然后输入到SonarQube (cxx-plugin)。虽然没有明显的分支机构,但很多地方的覆盖率都低于100%,所以应该是0%或100%。例如,如下所示:

代码语言:javascript
运行
复制
std::string quote(const std::string& str, const std::string& quote_str) {
    return quote_str + str + quote_str;
}

在SonarQube上,第一行被报告为“完全覆盖”。第二行报告为“测试部分覆盖(2种条件中的1种)”。第三行没有提到--正如预期的那样。问题是,我想gcovr在返回线上看到了哪些我不能看到的条件。

我尝试过Why gcc 4.1 + gcov reports 100% branch coverage and newer (4.4, 4.6, 4.8) reports 50% for "p = new class;" line?的一个建议(添加--排除--抛出分支),甚至尝试添加--排除--不可到达的分支。似乎没什么区别。

查看生成的xml输出,我注意到前几行都显示了57次branch="false“的点击。我想知道“两个条件中的一个”是从哪里来的,也许是SonarQube?

有没有其他人看到这个或者有解决办法?

更新

我一开始没有提到这一点,因为它似乎不相关,但我们使用的是clang v11 (不是gcc),因此在gcovr下面使用的是“llvm gcov”(不是gcov本身)。如下所示,这似乎很重要。

EN

回答 1

Stack Overflow用户

发布于 2020-09-24 19:38:47

,也许是SonarQube?

SonarQube不计算代码覆盖率信息。它只显示由其他工具生成的报告。如果有什么不正确的地方,您必须分析使用过的覆盖工具配置。

,其中“两个条件中的一个”来自

他们是来找覆盖工具的。表达式具有更多的分支,因为可以使用以下值执行该方法:

代码语言:javascript
运行
复制
+---------------------+
|   str   | quote_str |
+---------------------+
|   NULL  |   NULL    |
|   NULL  |  string   |
|  string |   NULL    |
|  string |  string   |
+---------------------+

如您所见,可能会引发一些异常。我相信您只检查了没有抛出异常的happy path,所以这就是为什么只覆盖1 of 2 conditions的原因。

正如您在注释中提到的,可以通过添加--exclude-throw-branches来禁用与异常相关的条件。我对C++代码没有很大的经验(我是一个Java ),但我希望代码覆盖率更低,并且注意潜在的异常,而不是看到100%的覆盖率,并在运行时遇到意外的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64023350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档