我在理解 C++ 中的分支覆盖时遇到了问题。即使对于一个简单的程序,分支覆盖率也是 50%。当我使用 boost 时,分支覆盖率低于 20%。
有人可以解释一下为什么会这样吗?我在用
-fno-exceptions -g -O0 -fprofile-arcs -ftest-coverage -fPIC -Wall
编译器标志和gcovr
生成报告。我也尝试lcov
过完全相同的结果
我在理解 C++ 中的分支覆盖时遇到了问题。即使对于一个简单的程序,分支覆盖率也是 50%。当我使用 boost 时,分支覆盖率低于 20%。
有人可以解释一下为什么会这样吗?我在用
-fno-exceptions -g -O0 -fprofile-arcs -ftest-coverage -fPIC -Wall
编译器标志和gcovr
生成报告。我也尝试lcov
过完全相同的结果
这只是一般的 C++ 编译器怪异。gcovr 和 lcov 都依赖于 GCC 在目标代码中测量的覆盖率数据,编译器似乎在那里插入了一些分支语句。
我在 Godbolt 上查看了生成代码的反汇编,编译器确实jne
在一个部分下插入了两个分支指令__static_initialization_and_destruction_0
。当您使用-O1
.
您应该为覆盖率测量选择哪些优化级别有点棘手。您启用的优化越多,就越难以将覆盖率测量绑定到特定的源代码行,因为编译器可能会优化很多代码。但是对于 C++,一些优化是意料之中的,当编译器产生不必要的代码时会让人感到困惑。就像这里的情况一样。无论您选择什么级别,您通常都无法实现完整的分支覆盖。
gcov 文档还讨论了将 gcov 与 GCC 优化一起使用。gcovr 使用 Gcov 来处理原始覆盖数据,因此具有相同的限制。
但是,gcovr 会执行一些后处理,它可以排除不包含源代码的行上的分支。}
在这里,当给定--exclude-unreachable-branches
标志时,这将忽略行上的任何分支。