gpt4 book ai didi

c++ - gcov 和全局析构函数

转载 作者:可可西里 更新时间:2023-11-01 16:46:45 24 4
gpt4 key购买 nike

MWE

#include <iostream>

struct Foo {
Foo() {
std::cout << "Constructing Foo " << this << std::endl;
}

~Foo() {
std::cout << "Destructing Foo " << this << std::endl;
}
};

Foo global_foo;

int main () {
std::cout << "Entering and exiting main()" << std::endl;
return 0;

问题

使用选项 -fprofile-arcs -ftest-coverage 编译上面的代码,运行程序,然后运行 ​​gcov。程序输出清楚地显示了 Foo::Foo()、main() 和 Foo::~Foo() 的调用顺序。 gcov 输出显示调用了 Foo::Foo() 和 main(),但未调用 Foo::~Foo()。

根本原因

全局对象由 GNU 内部退出处理程序(使用 at_exit() 注册的函数)销毁。最终的 gcov 统计信息由另一个退出处理程序生成。 gcov 退出处理程序显然在全局销毁退出处理程序之前被调用,因此 gcov 看不到正在调用的析构函数。

错误状态

这是 gcov 中一个老的、老的 bug。这是 Bugzilla 链接:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970 .九年后,该错误仍然存​​在,至少在 i686-apple-darwin10-g++-4.2.1 中是这样。

问题

这是 gcov 中无法解决的错误,我不得不忍受,还是只是碰巧从裂缝中溜走(九岁了,完全被遗忘了)?如果是后者,如何解决?

最佳答案

首先,请注意该错误报告自 2005 年以来一直没有得到重新确认;您可能应该添加一条说明您仍然看到 g++-4.2.1 中的不良行为。即使没有人根据您的消息采取行动,将这些信息公开也很有用。

短期内,如果您想继续使用 gcov,则必须忍受它。你可以考虑 lcov相反,它使您能够从覆盖率分析中排除指定的行。公平警告:我听说它很好,但我自己从未使用过它。

中期,将响应添加到错误跟踪器!没有保证,但也许这会引起足够的兴趣,让一些好心的人给你写一个补丁。

从长远来看,如果没有人愿意为您打补丁,您也许可以自己打补丁。 gcc 不是世界上最友好的代码库,接受您的更改可能是一种冒险,但如果您真的需要它,您可以实现它。

祝你好运。

关于c++ - gcov 和全局析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6372431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com