Question

J'ai un grand projet C ++ hérité compilé sous Visual Studio 2008. Je sais qu'il existe une quantité raisonnable de code "mort" qui n'est accessible nulle part - méthodes non appelées, classes entières non utilisées.

Je recherche un outil permettant d'identifier ceci par l'analyse statique .

Cette question: Détection de code mort dans un projet C / C ++ hérité suggère d'utiliser des outils de couverture de code. Ce n'est pas une option car la couverture de test n'est tout simplement pas assez élevée.

Il mentionne également un code -Wunreachable-code. option pour gcc. Je voudrais quelque chose de similaire pour Visual Studio. Nous utilisons déjà l'option / OPT: REF de l'éditeur de liens pour supprimer le code redondant, mais cela ne signale pas le code mort à un niveau utile (lorsqu'il est utilisé avec / VERBOSE, il compte plus de 100 000 lignes, dont beaucoup dans les bibliothèques).

Existe-t-il de meilleures options qui fonctionnent bien avec un projet Visual Studio?

Était-ce utile?

La solution

Vous souhaiterez adopter QA-C ++ ( http: //www.programmingresearch. com / QACPP_MAIN.html ), voir également http://fr.wikipedia.org/fr/ / List_of_tools_for_static_code_analysis pour des produits similaires.

Vous recherchez un outil d'analyse de code statique qui détecte le code inaccessible; De nombreuses directives de codage (telles que MISRA-C ++, si je ne me trompe pas) exigent qu'aucun code inaccessible n'existe. Un outil d'analyse spécialement conçu pour appliquer une telle directive serait votre meilleur choix.

Et vous aimerez pouvoir trouver d'autres utilisations pour l'outil.

Autres conseils

Je sais que les produits Limp de Gimpel ( PC-Lint et Flexelint ) identifiera le code inaccessible et les modules inutilisés / non référencés.

Ils appartiennent tous deux à la catégorie des outils d'analyse statique.

Je n'ai aucune affiliation avec Gimpel, mais un client satisfait à long terme.

Je ne connais pas Visual C et j'avais également recommandé les outils de couverture spécifiques à -Wunreachable-Code. Comme solution à votre situation, j’essaierais ce qui suit:

  1. Faites avec ctags (ou un programme similaire) une liste de tous vos symboles dans votre source
  2. Activez dans votre compilateur l'élimination du code mort (je supposerais qu'il est activé par défaut)
  3. Activez toutes les optimisations de programme / temps de liaison (afin qu'il sache que les fonctions non utilisées dans vos modules ne sont pas requises par les autres externes et sont ignorées)
  4. Prenez les symboles de votre binaire et comparez-les avec les symboles de 1.

Une autre approche pourrait consister en un outil de génération de graphe d’appel (par exemple, doxygen).

Je suggère que vous utilisiez quelques approches: 1. GCC a quelques indicateurs de compilation utiles:

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter

2. Cppcheck a quelques fonctionnalités utiles comme:

 --enable=unusedFunction

3. Utilisez l'analyseur statique comme suggéré précédemment.

Une des solutions qui me convient - avec Delphi - consiste à activer le débogage et à exécuter votre programme sous le débogueur.

Lorsqu'un programme Delphi est exécuté sous le débogueur, l'EDI indique dans la marge quelles lignes de code peuvent être définies en tant que points d'arrêt. Le code qui est vraiment mort - c’est-à-dire qu’il a été supprimé par l’éditeur de liens / compilateur est évident, car les points de rupture ne peuvent pas être définis ici.

Quelques notes supplémentaires, car les commentateurs semblent mal comprendre ceci:

a: Vous n'avez pas besoin d'essayer de définir un point d'arrêt sur chaque ligne. Ouvrez simplement le fichier source dans l'EDI et faites-le défiler rapidement. Le code mort est facilement repérable.

b: Ce n'est PAS une vérification de «couverture de code». Vous n'avez pas besoin d'exécuter l'application pour voir si elle atteint les lignes.

c: Je ne connais pas assez VS2008, donc je ne peux pas dire si cette suggestion fonctionnera.

Soit
1) L’utilisation de l'analyse statique de MSVC est sous-utilisée.
2) Le marketplace du MSVC contient de nombreux outils, notamment une assistance pour la plupart des outils gratuits, notamment CppCheck

Vous aurez besoin de la dernière version de Visual Studio pour les applications du marché, mais du logiciel gratuit "a href =" https://www.visualstudio.com/free-developer-offers/ "rel =" nofollow noreferrer ". > Édition communautaire " a des licences très indulgentes.

Écrivez un script qui supprime de manière aléatoire une fonction (du code source) et tout recompilé à partir de zéro. S'il compile toujours, cette fonction était un code mort.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top