54 votes

Identification des codes morts (C++)

J'ai un projet C++ important 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 permettra d'identifier cela en analyse statique .

Cette question : Détection de code mort dans un projet C/C++ existant suggère d'utiliser des 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 une option -Wunreachable-code. à gcc. J'aimerais 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 elle ne signale pas le code mort à un niveau utile (lorsqu'elle est utilisée avec /VERBOSE, il y a plus de 100 000 lignes, y compris beaucoup de bibliothèques).

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

0 votes

Nous avons écrit un programme AWK pour analyser ces "100k+ lignes" produites par le linker, et cela nous a permis de voir réellement ce qui se passe. Deux développeurs ont commencé lundi. Vendredi, nous avions un "noyau hérité" fonctionnel.

9voto

Dan Points 6319

Je sais que les produits Gimpel's Lint ( PC-Lint y 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, je suis juste un client satisfait de longue date.

7voto

Vous aurez besoin de quelque chose du type QA-C++ ( http://www.programmingresearch.com/QACPP_MAIN.html ), voir aussi http://en.wikipedia.org/wiki/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 conçu spécifiquement pour faire respecter une telle directive serait votre meilleure option.

Et vous serez également en mesure de trouver d'autres utilisations pour cet outil.

3voto

flolo Points 8757

Je ne connais pas Visual C, et j'avais également recommandé les outils de couverture spécifiques au code -Wunreachable-code. Comme solution pour 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 suppose qu'il est activé par défaut).
  3. Activez vos optimisations de temps pour l'ensemble du programme/lien (pour qu'il sache que les fonctions non utilisées dans vos modules ne sont pas requises par d'autres externes et sont écartées).
  4. Prenez les symboles de votre binaire et comparez-les avec les symboles de 1.

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

1voto

Je vous suggère d'utiliser deux 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 l'analyseur statique comme suggéré précédemment.

0voto

Tiger4Hire Points 85

Soit
1) MSVC est sous-utilisé en construction outil d'analyse statique .
2) Le MSVC marché dispose d'un grand nombre d'outils, dont la prise en charge de la plupart des outils gratuits, notamment CppCheck

Vous aurez besoin de la dernière version de Visual Studio pour les applications de marché, mais la version gratuite " Édition communautaire " a un permis très clément.

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