web-dev-qa-db-fra.com

Recherche de "code mort" dans une grande application héritée C ++

Je travaille actuellement sur une grande et ancienne application C++ qui a eu de nombreux développeurs avant moi. Il y a beaucoup de "code mort" dans le projet, des classes et des fonctions qui ne sont plus utilisées par personne.

Quels sont les outils disponibles pour C++ pour analyser une grande base de code pour détecter et refactoriser le code mort? Remarque: je ne parle pas d'un outil de couverture de test comme gcov.

Comment trouvez-vous le code mort dans votre projet?

56
gudnithor

Vous voudrez utiliser un outil d'analyse statique

Le principal problème que j'ai rencontré est que vous devez faire attention à ce qu'aucune bibliothèque ne soit utilisée à partir d'un endroit que vous ne contrôlez/n'avez pas. Si vous supprimez une fonction d'une classe qui est utilisée en référençant une bibliothèque dans votre projet, vous pouvez casser quelque chose que vous ne saviez pas utiliser le code.

27
Alan Jackson

Vous pouvez utiliser Cppcheck à cet effet:

$ cppcheck --enable=unusedFunction .
Checking 2380153.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[2380153.c:1]: (style) The function '2380153' is never used.
10
user6307369

callcatcher de Caolán McNamara est très efficacement utilisé dans le projet LibreOffice (~ 6 MLOC) pour trouver le code mort.

3
phw

Rien ne vaut la familiarité avec le code. Sauf peut-être une taille rigoureuse au fur et à mesure.

Parfois, ce qui ressemble à du bois mort est utilisé comme échafaudage pour les tests unitaires, etc., ou il semble être vivant simplement parce que les tests unitaires hérités l'exercent, mais il n'est jamais exercé en dehors des tests. Il y a peu de temps, j'ai supprimé plus de 1000 LOC qui prenaient en charge les traducteurs externes CAD modèle, nous avons eu des tests appelant ces traducteurs externes, mais ces traducteurs n'étaient pas pris en charge depuis 8 ans et plus et il n'y avait aucun moyen qu'un l’utilisateur de l’application, même s’il le voulait, pourrait jamais les invoquer.

À moins que l'on ne soit rigoureux pour se débarrasser du bois mort, on trouvera que votre équipe entretient les choses pendant des années.

3
lilburne

Je pense que votre meilleur pari serait probablement un outil de couverture. Il y en a beaucoup pour * nix et windows. Si vous avez des tests unitaires, c'est facile - si vous avez une faible couverture de test, alors le code découvert est soit mort soit pas encore testé (vous voulez quand même les deux morceaux de cette information). Si vous n'avez pas de tests unitaires, créez votre application avec l'instrumentation fournie par l'un de ces outils, exécutez-la via certains (devrait être idéalement) des chemins d'exécution, et consultez le rapport. Vous obtenez les mêmes informations qu'avec les tests unitaires, cela ne demandera que beaucoup plus de travail.

Puisque vous utilisez VisualStudio, je pourrais vous fournir quelques liens que vous pourriez envisager d'utiliser:

Aucun d'eux n'est gratuit, même pas bon marché, mais le résultat en vaut généralement la peine.

Sur * des plates-formes de type nix gcov couplé à des outils comme zcov ou lcov est un très bon choix.

3
Dmitry

Une approche consiste à utiliser l'élément de menu contextuel "Rechercher toutes les références" sur les noms de classe et de fonction. Si une classe/fonction n'est référencée qu'en elle-même, c'est presque certainement du code mort.

Une autre approche, basée sur la même idée, consiste à supprimer (commenter) les fichiers/fonctions du projet et à voir quels messages d'erreur vous obtiendrez.

1
hongliang

Voir notre Couverture du test SD C++ .

Vous devez effectuer de nombreux tests dynamiques pour appliquer le code, afin de vous assurer d'atteindre le maximum de couverture. Le code "non couvert" peut être mort ou non; peut-être que vous n'aviez tout simplement pas de test pour l'exercer.

0
Ira Baxter