69 votes

Trouver le "code mort" dans une grande application C++ héritée du passé

Je travaille actuellement sur une importante et ancienne application C++ qui a connu 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 faire une analyse d'une grande base de code afin de détecter et de remanier le code mort ? Note : Je ne parle pas des outils de couverture de test comme gcov.

Comment trouver le code mort dans votre projet ?

2 votes

Utilisez une sorte d'outil de couverture de code. J'allais suggérer gcov mais je ne sais pas ce qui est disponible en VC.

0 votes

Nous avons utilisé Bullseye avec succès. Voici un lien pour une copie d'évaluation. bullseye.com/evaluation.html

0 votes

31voto

Alan Jackson Points 3420

Vous voudrez utiliser un analyse statique outil

Le principal problème que j'ai rencontré est que vous devez faire attention à ce que les bibliothèques ne soient pas utilisées à partir d'un endroit que vous ne contrôlez pas. Si vous supprimez une fonction d'une classe qui est utilisée en faisant référence à une bibliothèque dans votre projet, vous pouvez casser quelque chose dont vous ne saviez pas que le code était utilisé.

1 votes

Que faire si le code mort dépend d'interactions spécifiques de l'utilisateur au moment de l'exécution ? Comment éliminer le code qui n'est pas utilisé, mais nous ne savons quel code est inutilisé qu'après que des actions d'exécution ont été effectuées sur l'application par l'utilisateur final ? Par exemple, compiler un programme, l'utiliser, puis, sur cette base, supprimer tous les chemins de code qui n'ont pas été utilisés. Existe-t-il un outil pour cela ?

0 votes

Le deuxième lien est mort.

4voto

phw Points 146

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

3voto

Dmitry Points 3946

Je pense que votre meilleure chance 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 non couvert est soit mort, soit pas encore testé (vous voulez les deux éléments de cette information de toute façon). Si vous n'avez pas de tests unitaires, construisez votre application avec l'instrumentation fournie par l'un de ces outils, exécutez-la par quelques chemins d'exécution (idéalement tous), et consultez le rapport. Vous obtiendrez les mêmes informations qu'avec les tests unitaires, mais cela vous demandera beaucoup plus de travail.

Puisque vous utilisez VisualStudio, je peux vous fournir quelques liens que vous pouvez envisager d'utiliser :

Aucune d'entre elles n'est gratuite, ni même bon marché, mais le résultat en vaut généralement la peine.

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

0 votes

Après avoir détecté la couverture du code, comment compiler le code inutilisé ? L'un de ces outils a-t-il la capacité de le faire ?

3voto

lilburne Points 482

Rien ne vaut la familiarité avec le code. Sauf peut-être un élagage rigoureux 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 existants 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 des traducteurs externes de modèles de CAO. Nous avions des tests qui invoquaient ces traducteurs externes, mais ces traducteurs n'étaient plus pris en charge depuis plus de huit ans et il était impossible pour un utilisateur de l'application, même s'il le voulait, de les invoquer.

Si l'on ne se débarrasse pas rigoureusement du bois mort, on verra votre équipe entretenir le matériel pendant des années.

1 votes

Même avec un élagage en cours de route, des choses passent à travers les mailles du filet - il y a toujours un très bon cas d'utilisation pour être capable de trouver du code mort globalement.

2voto

hongliang Points 439

Une approche consiste à utiliser l'élément de menu contextuel "Find All References" sur les noms de classes et de fonctions. Si une classe/fonction n'est référencée qu'en elle-même, il s'agit presque certainement de code mort.

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

5 votes

Cette approche est définitivement no applicable aux grands projets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X