gcovr/SonarQube 说简单的 C++ 函数只覆盖了一半
gcovr/SonarQube saying simple C++ function is only half covered
我们在我们的代码库上 运行 gcovr,它是 (FTR) 然后输入到 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 在 return 行上看到的我看不到的条件是什么。
我尝试了 Why gcc 4.1 + gcov reports 100% branch coverage and newer (4.4, 4.6, 4.8) reports 50% for "p = new class;" line? 的建议(添加 --exclude-throw-branches),甚至尝试添加 --exclude-unreachable-branches。好像没什么区别。
查看生成的 xml 输出,我注意到前几行都显示了 57 个 branch="false" 的匹配项。我想知道“2 个条件中的 1 个”来自哪里,也许是 SonarQube?
有没有其他人看到这个或有解决方案?
更新
我一开始没有提到这个,因为它看起来不相关,但我们使用的是 clang v11(不是 gcc),因此在 gcovr 下使用“llvm-cov gcov”(不是 gcov 本身)。如下所示,这似乎很重要。
perhaps it is SonarQube?
SonarQube 不计算代码覆盖率信息。它只显示由其他工具生成的报告。如果有什么不对,就得分析一下使用的覆盖工具配置了。
where the "1 of 2 conditions" comes from
他们是为了覆盖工具而来的。表达式有更多分支,因为可以使用以下值执行该方法:
+---------------------+
| str | quote_str |
+---------------------+
| NULL | NULL |
| NULL | string |
| string | NULL |
| string | string |
+---------------------+
如您所见,可能会抛出一些异常。我相信您只检查了没有抛出异常的 happy path
,所以这就是为什么只覆盖 1 of 2 conditions
的原因。
正如您在评论中提到的,可以通过添加 --exclude-throw-branches
来禁用与异常相关的条件。我在 C++ 代码方面没有丰富的经验(我是 Java 开发人员),但我更愿意使用较低的代码覆盖率并注意潜在的异常,而不是看到 100% 的覆盖率并在运行时遇到意外问题。
我之前确实写过一篇评论说它可能是sonarqube,但我又看了一眼:)
我认为您对可能值的评论是有缺陷的,因为这些是标准的 C++ 字符串(不是 C 字符串),因此实际上不能为 NULL。但是,添加时可能存在 OOM 异常 - 您可能是对的,未跟随的分支是此异常。
我做了一些实验,比较了使用 --exclude-throw-branches 和 --exclude-unreachable-branches 的 gcovr 输出。基本上它对这一行的 gcovr 报告没有影响,尽管它确实对其他行产生了一些影响。
我不确定我提到我们使用的是 clang 而不是(比方说)gcc。 我想这可能会有所作为。不确定。无论反映如何,这似乎是 gcov/gcovr 问题而不是 sonarqube。 我最初认为这没有什么区别。似乎是这样。据我所知,“llvm-com gcov”(模拟 gcov 的 llvm-cov 的子命令)不会生成标签以显示某些分支反映了抛出。我在本地查看了输出——我可能需要与 gcc 和 gcov 进行比较。然而,这似乎是真正的问题。
我们在我们的代码库上 运行 gcovr,它是 (FTR) 然后输入到 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 在 return 行上看到的我看不到的条件是什么。
我尝试了 Why gcc 4.1 + gcov reports 100% branch coverage and newer (4.4, 4.6, 4.8) reports 50% for "p = new class;" line? 的建议(添加 --exclude-throw-branches),甚至尝试添加 --exclude-unreachable-branches。好像没什么区别。
查看生成的 xml 输出,我注意到前几行都显示了 57 个 branch="false" 的匹配项。我想知道“2 个条件中的 1 个”来自哪里,也许是 SonarQube?
有没有其他人看到这个或有解决方案?
更新
我一开始没有提到这个,因为它看起来不相关,但我们使用的是 clang v11(不是 gcc),因此在 gcovr 下使用“llvm-cov gcov”(不是 gcov 本身)。如下所示,这似乎很重要。
perhaps it is SonarQube?
SonarQube 不计算代码覆盖率信息。它只显示由其他工具生成的报告。如果有什么不对,就得分析一下使用的覆盖工具配置了。
where the "1 of 2 conditions" comes from
他们是为了覆盖工具而来的。表达式有更多分支,因为可以使用以下值执行该方法:
+---------------------+
| str | quote_str |
+---------------------+
| NULL | NULL |
| NULL | string |
| string | NULL |
| string | string |
+---------------------+
如您所见,可能会抛出一些异常。我相信您只检查了没有抛出异常的 happy path
,所以这就是为什么只覆盖 1 of 2 conditions
的原因。
正如您在评论中提到的,可以通过添加 --exclude-throw-branches
来禁用与异常相关的条件。我在 C++ 代码方面没有丰富的经验(我是 Java 开发人员),但我更愿意使用较低的代码覆盖率并注意潜在的异常,而不是看到 100% 的覆盖率并在运行时遇到意外问题。
我之前确实写过一篇评论说它可能是sonarqube,但我又看了一眼:) 我认为您对可能值的评论是有缺陷的,因为这些是标准的 C++ 字符串(不是 C 字符串),因此实际上不能为 NULL。但是,添加时可能存在 OOM 异常 - 您可能是对的,未跟随的分支是此异常。
我做了一些实验,比较了使用 --exclude-throw-branches 和 --exclude-unreachable-branches 的 gcovr 输出。基本上它对这一行的 gcovr 报告没有影响,尽管它确实对其他行产生了一些影响。
我不确定我提到我们使用的是 clang 而不是(比方说)gcc。 我想这可能会有所作为。不确定。无论反映如何,这似乎是 gcov/gcovr 问题而不是 sonarqube。 我最初认为这没有什么区别。似乎是这样。据我所知,“llvm-com gcov”(模拟 gcov 的 llvm-cov 的子命令)不会生成标签以显示某些分支反映了抛出。我在本地查看了输出——我可能需要与 gcc 和 gcov 进行比较。然而,这似乎是真正的问题。