我们在我们的代码库(FTR)上运行 gcovr,然后输入 SonarQube(cxx-plugin)。有很多地方报告的覆盖率低于 100%,即使没有明显的分支,所以应该肯定是 0 或 100%。举个例子:
std::string quote(const std::string& str, const std::string& quote_str) {
return quote_str + str + quote_str;
}
在 SonarQube 上,第一行报告为“完全覆盖”。第二行报告为“部分被测试覆盖(2 个条件中的 1 个)”。没有提到第三行 - 正如预期的那样。问题是(我猜)gcovr 在返回线上看到的我不能看到的条件是什么。
我已经尝试过为什么 gcc 4.1 + gcov 报告 100% 分支覆盖率和更新的 (4.4, 4.6, 4.8) 报告 50% 为“p = new class;”的建议 线?(添加--exclude-throw-branches),甚至尝试添加--exclude-unreachable-branches。似乎没什么区别。
查看生成的 xml 输出,我注意到前几行都显示 57 次命中,分支 =“false”。我想知道“两个条件中的一个”来自哪里,也许是 SonarQube?
有没有其他人看到这个或有解决方案?
更新
我一开始没有提到这一点,因为它似乎无关紧要,但我们使用的是 clang v11(不是 gcc),因此在 gcovr 下使用“llvm-cov gcov”(不是 gcov 本身)。如下所示,这似乎很重要。