Identification du code mort (c++)

j'ai un grand héritage projet C++ compilé sous Visual Studio 2008. Je sais qu'il y a une quantité raisonnable de code "mort" qui n'est accessible nulle part -- des méthodes qui ne sont pas appelées, des classes entières qui ne sont pas utilisées.

je suis à la recherche d'un outil qui va identifier ce par analyse statique .

à Cette question: détection du code Mort en héritage en C/C++ projet suggère d'utiliser les outils de couverture de code. Ce n'est pas une option car la couverture des tests n'est tout simplement pas assez élevée.

il mentionne également un-Wunreachable-code. option vers gcc. J'aimerais quelque chose de similaire pour Visual Studio. Nous utilisons déjà l'option /OPT:REF pour supprimer le code redondant, mais cela ne signale pas le code mort à un niveau utile (lorsqu'il est utilisé avec /VERBOSE il y a plus de 100 000 lignes, y compris beaucoup de bibliothèques).

y at-il de meilleures options qui fonctionnent bien avec un Visuel Studio de projet?

51
demandé sur Community 2008-11-26 19:07:29

7 réponses

vous voulez quelque chose comme QA-C++ ( http://www.programmingresearch.com/QACPP_MAIN.html ), voir également http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis pour les produits similaires.

vous êtes à la recherche d'un outil d'analyse de code statique qui détecte le code inaccessible; de nombreuses lignes directrices de codage (comme MISRA-C++, si Je ne me trompe pas) exigent qu'aucun code inaccessible n'existe. Un outil d'analyse spécialement conçus pour appliquer une telle orientation serait votre meilleur pari.

Et vous serez comme être en mesure de trouver d'autres utilisations de l'outil.

6
répondu 2008-11-26 16:37:53

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

ils entrent tous deux dans la catégorie des outils d'analyse statique.

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

8
répondu Dan 2009-06-30 20:15:43

Je ne sais pas Visual C, et avait également recommandé le-Wunreachable-outils de couverture spécifiques. 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. activer dans votre compilateur l'élimination de code mort (je suppose qu'il est par défaut à on)
  3. activez vos optimisations de temps tout-programme/lien (donc il sait que pas les fonctions utilisées dans vos modules ne sont pas tenus par d'autres personnes externes et de se jeter)
  4. Prendre les symboles de votre binaire et les comparer avec les symboles de 1.

une autre approche pourrait être un outil de génération de graphe d'appel (par exemple doxygen).

3
répondu flolo 2008-11-26 16:43:12

je vous suggère d'utiliser quelques approches: 1. GCC a quelques drapeaux 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 un analyseur statique comme cela a été suggéré auparavant.

1
répondu unresolved_external 2017-08-28 12:22:53

Une approche qui fonctionne pour moi - avec Delphi est pour 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'IDE indique dans la marge quelles lignes de code peuvent être définies comme points de rupture. Le Code qui est vraiment mort-c'est-à-dire qui a été effacé par le linker/compilateur est évident car les points de rupture ne peuvent pas y être définis.

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

: Vous n'avez pas besoin d'essayer de définir un point d'arrêt sur chaque ligne. Il suffit d'ouvrir le fichier source dans l'IDE, et de faire défiler rapidement. Le code mort est facilement repéré.

b: il ne s'agit pas d'un contrôle de couverture de code. Vous n'avez pas besoin d'exécuter l'application pour voir si elle atteint les lignes.

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

0
répondu Roddy 2010-01-18 09:17:39

soit

1) MSVC est sous-utilisé dans la construction de outil d'analyse statique .

2) le MSVC marketplace a beaucoup d'outils, y compris le soutien de la plupart des outils libres, y compris CppCheck

vous aurez besoin de la dernière version de Visual Studio pour les applications du marché, mais le libre " édition communautaire " a très clémente délivrance des licences.

0
répondu Tiger4Hire 2018-04-22 12:38:58

Écrire un script qui supprime au hasard une fonction (à partir du code source) et recompile tout à partir de zéro. Si elle compile encore - cette fonction était le code mort.

-2
répondu Krzysztof Kowalczyk 2009-02-18 21:12:01