1

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

在此处输入图像描述

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

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

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

4

1 回答 1

2

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

在 Godbolt 上查看了生成代码的反汇编,编译器确实jne在一个部分下插入了两个分支指令__static_initialization_and_destruction_0。当您使用-O1.

您应该为覆盖率测量选择哪些优化级别有点棘手。您启用的优化越多,就越难以将覆盖率测量绑定到特定的源代码行,因为编译器可能会优化很多代码。但是对于 C++,一些优化是意料之中的,当编译器产生不必要的代码时会让人感到困惑。就像这里的情况一样。无论您选择什么级别,您通常都无法实现完整的分支覆盖。

gcov 文档还讨论了将 gcov 与 GCC 优化一起使用。gcovr 使用 Gcov 来处理原始覆盖数据,因此具有相同的限制。

但是,gcovr 会执行一些后处理,它可以排除不包含源代码的行上的分支。}在这里,当给定--exclude-unreachable-branches标志时,这将忽略行上的任何分支。

于 2018-01-09T22:28:51.717 回答