我在理解c ++中的分支覆盖时遇到问题。即使对于简单的程序,分支覆盖率也是50%。当我使用提升时,分支覆盖率低于20%。
有人可以解释一下为什么会这样吗?我正在使用
-fno-exceptions -g -O0 -fprofile-arcs -ftest-coverage -fPIC -Wall
编译器标志和gcovr
用于生成报告。我也尝试了lcov
完全相同的结果
答案 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
行上的任何分支。