【发布时间】:2021-12-29 01:58:09
【问题描述】:
我最近升级到了新版本的 gcc/g++/gcov,现在 gcov 的行为很奇怪。新版本声称某些代码行没有被旧版本覆盖。我设法将我的代码简化为这个最小的示例。
#include <memory>
using namespace std;
struct S {};
int main() {
unique_ptr<S> s;
s = make_unique<S>();
}
然后我使用g++ -O0 -Wall -Wextra -Werror --std=c++17 --coverage 编译此文件,运行生成的a.out,然后运行gcov。
生成的.gcov 文件包含:
-: 0:Runs:1
-: 1:#include <memory>
-: 2:using namespace std;
-: 3:struct S {};
-: 4:
1: 5:int main() {
#####: 6: unique_ptr<S> s;
1: 7: s = make_unique<S>();
1: 8:}
这与旧版本的 gcov 不同,后者声称第 6 行被命中 2 次。
为什么 gcov 认为第 6 行没有被覆盖?我做错了吗?
我能够使用 gcc8、gcc9 和 gcc10 重现此行为。 gcc7 的行为符合预期。
比较 gcc7/8 的编译器资源管理器:https://godbolt.org/z/Te57s4WK8
【问题讨论】:
-
代码和机器指令不存在 1 比 1 的相关性。如果你真的想在这个问题上挖洞,请将两者都加载到 Godbolt 中并查看程序集,看看到底有什么,或者没有,视情况而定可能是。
-
纯粹出于好奇,我继续这样做了。在 Godbolt GCC 7 中,额外的 3 行汇编代码归属于第 6 行,而在 GCC8+ 中,它归属于第 7 行。这 3 行中的每一行都是相同的。
-
我知道源代码行和机器代码之间没有直接关联。但这个结果似乎不一致。第 6 行没有关联的机器代码并且 gcov 应该报告
-,或者它确实有关联的机器代码并且 gcov 应该报告它已覆盖。#####应该是不可能的。 @Taekahn -
在 Godbolt 中只需右键单击并选择显示代码。第 6 行的部分有 2 个分段,所以向下滚动。如果你愿意,我会在我回家时连接我的神栓
-
@Taekahn 我刚试过,代码属性的方式看起来是一样的。
标签: c++ g++ code-coverage gcov gcovr