我最近升级到新版本的 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