【发布时间】:2017-06-19 14:48:21
【问题描述】:
我们正在使用 LCOV/GCOV 来生成我们项目的测试覆盖率。最近我们尝试另外启用分支覆盖。但看起来,这并没有产生我们从高级开发人员视图中预期的结果。
将分支覆盖与 C++ 结合使用会使报告在整个地方都出现分支。我们怀疑(正如搜索问题所表明的那样)大多数异常处理代码会创建这些“隐藏分支”。而 GCOV/LCOV 似乎并没有跳过这些。
我创建了一个小测试项目来显示问题:https://github.com/ghandmann/lcov-branch-coverage-weirdness
目前我们使用的是 Ubuntu 16.04。与:
- gcc v5.4
- lcov & genhtml v1.12
我们的生产代码是在启用 c++11 的情况下构建的。最小的示例不是在启用 c++11 的情况下构建的,但是当我们对所有不同的选项(c++ 标准、优化、-fno-exceptions)进行了一些试验时,我们没有得出一个可以接受的结果。
有人有想法吗?小费?我们是否以错误的方式使用任何东西?这是 - 如其他地方所述 - 真的是预期的行为吗?
更新:
正如gcc-help mailing list 中所指出的,这些“隐藏分支”是由于异常处理而发生的。因此,将-fno-exceptions 开关添加到 gcc 会为“简单”程序产生 100% 的分支覆盖率。但是当异常被禁用时,gcc 拒绝编译实际使用异常的代码(例如 try-catch、throw)。因此,对于真正的生产代码,这不是一个选项。看起来,在这种情况下,您必须简单地将 ~50% 的覆盖率声明为新的 100%。 ;)
【问题讨论】:
-
正如 maxschlepzig 所解释的,您实际上想要“部分分支覆盖”,因为您明确想要排除一些异常部分(这通常很有用)。要实现这一点,您可能需要过滤结果,请参阅 maxschlepzig 的答案。
标签: c++ code-coverage gcov lcov