在 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 邮件列表 中指出的那样,这些“隐藏分支”是由于异常处理引起的。因此,在 gcc 中添加
-fno-exceptions
开关可以为“简单”的程序产生 100% 的分支覆盖率。但是当禁用异常时,gcc 拒绝编译实际使用异常的代码(例如 try-catch、throw)。因此对于真正的生产代码来说,这不是一个选择。看起来在这种情况下,您必须将 ~50% 的覆盖率声明为新的 100%。 ;)