低分支覆盖率,尤其是在使用第三方库时。前提升

时间:2017-06-20 14:03:41

标签: c++ boost code-coverage gcovr

我在理解c ++中的分支覆盖时遇到问题。即使对于简单的程序,分支覆盖率也是50%。当我使用提升时,分支覆盖率低于20%。

enter image description here

有人可以解释一下为什么会这样吗?我正在使用

-fno-exceptions -g -O0 -fprofile-arcs -ftest-coverage -fPIC -Wall

编译器标志和gcovr用于生成报告。我也尝试了lcov完全相同的结果

1 个答案:

答案 0 :(得分:2)

这只是一般C ++编译器的怪异。 gcovr和lcov都依赖于GCC在目标代码中测量的覆盖率数据,并且编译器似乎在那里插入了一些分支语句。

我查看了disassembly of the generated code on Godbolt,编译器确实在jne部分下插入了两个__static_initialization_and_destruction_0分支指令。使用-O1进行编译时,这些会消失。

您应该为覆盖率测量选择哪些优化级别有点棘手。您启用的优化越多,将覆盖率测量与特定源代码行联系起来就越困难,因为编译器可能会优化很多代码。但是对于C ++,需要进行一些优化,并且当编译器生成不必要的代码时会让人感到困惑。就像这里的情况一样。无论您选择何种级别,您通常都无法实现完整的分支覆盖。

gcov文档还讨论了using gcov with GCC optimization。 gcovr使用Gcov处理原始覆盖数据,因此具有相同的限制。

然而,gcovr执行一些后处理,它可以排除不带有源代码的行上的分支。在这里,当给出}标志时,这将忽略--exclude-unreachable-branches行上的任何分支。