MWEgcov et Destructeurs mondial
#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;
}
Le problème
Compile ci-dessus avec des options -fprofile-arcs -ftest-coverage
, RUNN le programme, puis exécutez gcov. La sortie du programme montre clairement que Foo :: Foo(), main() et Foo :: ~ Foo() sont appelés, dans cet ordre. La sortie de gcov montre que Foo :: Foo() et main() sont appelés, mais pas Foo :: ~ Foo().
racine motif
Les objets globaux sont détruits par un gestionnaire de sortie interne GNU (fonction enregistrée avec at_exit()). Les statistiques gcov finales sont produites par un autre gestionnaire de sortie. Le gestionnaire d'exit gcov est évidemment appelé avant le gestionnaire d'exit de destruction global, donc gcov ne voit pas les destructeurs appelés.
état Bug
Ceci est un vieux, vieux bug dans gcov. Voici le lien Bugzilla: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970. Le bug existe toujours neuf ans plus tard, au moins dans i686-apple-darwin10-g ++ - 4.2.1.
La question
Est-ce un bug dans gcov sans solution, quelque chose que je dois vivre avec, ou est-il juste quelque chose qui est arrivé à se glisser à travers les mailles du filet (neuf ans et totalement oubliées)? Si ce dernier, comment le réparer?
Quelques upvotes, un downvote (aucun commentaire?), Mais pas de réponses ou de commentaires jusqu'à présent. Est-ce que les membres de débordement de pile ont un moyen de communiquer avec l'équipe de développement de gcc? –