2011-06-16 5 views
9

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?

+0

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? –

Répondre

2

Tout d'abord, notez que ce rapport de bogue n'a pas été reconfirmé depuis 2005; vous devriez probablement ajouter une note disant que vous voyez encore le mauvais comportement de g ++ - 4.2.1. Même si personne n'agit sur votre message, il est utile d'avoir cette information là-bas.

À court terme, si vous voulez continuer à utiliser gcov, vous devez vivre avec. À la place, vous pouvez considérer lcov, ce qui vous permet d'exclure des lignes spécifiées de l'analyse de couverture. Juste avertissement: J'ai entendu dire que c'est bien, mais je ne l'ai jamais utilisé moi-même.

À moyen terme, ajoutez cette réponse au bug tracker! Aucune garantie, mais peut-être que cela suscitera suffisamment d'intérêt pour que quelqu'un d'âme vous écrive un patch.

À long terme, si personne n'est prêt à le patcher pour vous, vous pourriez être en mesure de patcher vous-même. gcc n'est pas la base de code la plus conviviale au monde, et obtenir vos changements acceptés peut être une aventure, mais si vous en avez vraiment besoin, vous pouvez y arriver.

Bonne chance.

+2

Merci pour la réponse. J'ai ajouté au rapport bugzilla. La réponse à court terme est évidemment "vivre avec". Notre produit est une bibliothèque C++ dont l'utilisation principale est dans un environnement de simulation autocodé. Puisque c'est notre objectif, beaucoup de nos tests sont effectués dans cet environnement. La dernière incarnation de cet environnement crée des données statiques globales. Nous avons également une capacité de test unitaire qui contourne cet environnement.Une solution évidente consiste donc à demander aux développeurs de développer des tests unitaires ctor_dtor. (Ce que j'ai fait, et j'entends déjà les grognements.) –