Bonjour
Je viens de passer un peu (trop) de temps à investiguer un bug qui causait une segmentation fault.
Sur un projet un peu volumineux où le code est construit par module sous la forme de bibliothèques liées dynamiquement, j'ai une lib qui expose une classe Foo, avec un constructeur sous la forme :
Foo::Foo(std::shared_ptr<Bar> bar){
// ...
}
Bar étant une classe abstraite. C'est l'exécutable qui possède une classe dérivée de Bar et fournit l'implémentation.
La segfault se produit lorsque l'on tente d'accéder à un champ de Bar.
bar->champBar; // crash
Je n'avais pas de crash si je tentais d'accéder à une fonction virtuelle. Pas de crash non plus si le constructeur était inliné dans le header Foo.h.
Dans un premier temps, j'ai cru à un problème de slice, et j'ai cherché à débusquer un appel implicite à un constructeur de copie, en vain.
Finalement, il s'est avéré que lors du build de la lib et de l'exécutable, une des dépendances de Bar n'était pas configurée de la même façon, causant une incompatibilité binaire entre l'interface et l'implémentation.
Existe-t-il un moyen de mettre en évidence ce type de problème lors de l'édition des liens (j'utilise gcc et la configuration de build est gérée sous CMake) ? Ou au moins un outil d'analyse des binaires qui pourrait relever le problème avant que l'appli ne crashe lamentablement à l'exécution ?
Partager