Détection du code mort en héritage en C/C++ projet
Comment voulez-vous aller sur la détection du code mort dans le code C/C++? J'ai une assez grande base de code pour travailler avec et au moins 10 à 15% est du code mort. Est-il basé sur Unix outil pour identifier ces domaines? Certains morceaux de code utilisent encore beaucoup de préprocesseur, peut processus automatisé gérer cela?
- Theres une question similaire, avec plus d'activité ici: stackoverflow.com/questions/4813947/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une analyse de couverture de code pour cela l'outil et de regarder pour les taches dans votre code.
Un outil populaire pour la chaîne de compilation gcc est gcov, avec l'interface graphique lcov (http://ltp.sourceforge.net/coverage/lcov.php).
Si vous utilisez gcc, vous pouvez compiler avec gcov de soutien, qui est activée par le "--couverture de " drapeau. Ensuite, exécutez votre application ou de l'exécution de votre suite de tests avec cette gcov permis de construire.
Fondamentalement gcc émet des fichiers lors de la compilation et de l'application émettent aussi des données de couverture lors de l'exécution. Vous devez collecter toutes ces (.gcdo et .gcda fichiers). Je ne vais pas en détail ici, mais vous avez probablement besoin de définir deux variables d'environnement pour recueillir les données sur la couverture dans un façon saine: GCOV_PREFIX et GCOV_PREFIX_STRIP...
Après la course, vous pouvez mettre toutes les données sur la couverture, ensemble, et le lancer à travers la lcov toolsuite. Fusion de tous les fichiers de couverture de différents essais est également possible, quoique un peu impliquées.
De toute façon, vous vous retrouvez avec une belle série de pages web montrant quelques renseignements sur la couverture, en pointant les morceaux de code qui n'ont pas de couverture et, par conséquent, n'ont pas été utilisés.
Bien sûr, vous avez besoin de vérifier si les portions de code ne sont pas utilisés dans n'importe quelle situation et beaucoup dépend de la qualité de vos tests d'exercice de la base de code. Mais au moins, cela vous donnera une idée sur la possible mort de code de candidats...
gcov
) peut fournir des données de code n'est pas couvert par la série particulière(s) du logiciel, le code qui n'est pas couvert n'est pas nécessairement du code mort. Une autre exécution du logiciel (comme les différentes option de compilation, différents exécution de l'option ou de différentes données d'entrée) ou sur un autre chemin d'exécution (par exemple, erreur de manipulation) peut déclencher une fonction qui n'a pas été évoquée plus tôt.Le compiler avec gcc avec -Wunreachable-code.
Je pense que la plus récente de la version, les meilleurs résultats que vous obtiendrez, mais je peux me tromper dans mon impression que c'est quelque chose qu'ils ont commencé à travailler sur. Il faut noter que l'analyse des flux, mais je ne crois pas qu'il vous dit au sujet de "code", ce qui est déjà mort au moment où il quitte le préprocesseur, parce que ce n'est jamais analysée par le compilateur. Donc, il ne sera pas en mesure de détecter par exemple des fonctions exportées qui ne sont jamais appelés, ou cas particulier de la manipulation de code qui vient d'arriver à être impossible parce que jamais rien n'appelle la fonction avec le paramètre - vous besoin de couverture de code pour que (et d'exécuter les tests fonctionnels, de ne pas les tests unitaires. Les tests unitaires sont censé d'avoir 100% de couverture de code, et donc d'exécuter du code des chemins qui sont "morts" aussi loin que l'application est en cause). Encore, avec ces limites à l'esprit, c'est un moyen facile d'obtenir commencé à trouver le plus complètement bollixed routines dans la base de code.
Cette CERT consultatif sur les listes de certains autres outils pour la statique de la détection du code mort
-O0
que c'est avec-O3
, ou ne veut pas de nouvelles mises en garde à chaque fois que l'optimiseur s'améliore.Votre approche dépend de la disponibilité (automatisée) des tests. Si vous avez une suite de test qui vous avez confiance pour couvrir une quantité suffisante de fonctionnalités, vous pouvez utiliser une analyse de la couverture, comme les réponses précédentes déjà suggéré.
Si vous n'êtes pas chanceux, vous voudrez peut-être regarder dans le code source des outils d'analyse comme SciTools' Comprendre qui peut vous aider à analyser votre code à l'aide de beaucoup de construit dans les rapports d'analyse. Mon expérience avec cet outil date de il y a 2 ans, donc je ne peux pas vous donner beaucoup de détails, mais ce que je me souviens c'est qu'ils avaient un impressionnant soutien très rapide, les délais de corrections de bugs et des réponses à des questions.
J'ai trouvé une page sur statique d'analyse de code source qui répertorie de nombreux autres outils.
Si cela ne vous aide pas suffisamment, et que vous êtes particulièrement intéressé à trouver le préprocesseur liés à la mort de code, je vous recommande de poster un peu plus de détails sur le code. Par exemple, si il est la plupart du temps liées à diverses combinaisons de #ifdef paramètres, vous pouvez écrire des scripts pour déterminer la (les combinaisons de paramètres et de trouver les combinaisons qui ne sont jamais réellement construite, etc.
g++ 4.01 -Wunreachable-code met en garde sur le code qui est inaccessible à l'intérieur d'une fonction, mais ne pas avertir à propos des fonctions inutilisées.
g++ 4.01 émet un avertissement sur le point b, mais ne disent rien sur foo() (point a), même si elle est inaccessible dans ce fichier. Ce comportement est correct, bien que décevant, car le compilateur ne peut pas savoir que la fonction foo() n'est pas déclaré extern dans quelque autre unité de compilation et invoqué à partir de là; seulement un éditeur de liens peut être sûr.
Pour du code C seulement et en supposant que le code source de l'ensemble du projet
est disponible, lancer une analyse avec l'outil Open Source Frama-C.
Toute instruction du programme qui s'affiche en rouge dans l'interface graphique est
code mort.
Si vous avez le "code mort" des problèmes, vous pouvez aussi être intéressé à
retrait "de rechange code", un code qui est exécuté, mais n'a pas
contribuer au résultat final. Cela vous oblige à fournir
une modélisation précise des fonctions d'e/S (vous ne voulez pas
pour supprimer un calcul qui semble être "libres", mais
qui est utilisé comme un argument de
printf
). Frama-C dispose d'une option pour souligner de rechange code.Les deux Mozilla et Open Office ont des solutions "maison".
Mort d'analyse de code comme ceci nécessite une analyse globale de l'ensemble de votre projet. Vous ne pouvez pas obtenir cette information par l'analyse des unités de traduction individuellement (eh bien, vous pouvez détecter les morts entités si elles sont entièrement à l'intérieur d'une seule unité de traduction, mais je ne pense pas que c'est ce que vous êtes vraiment à la recherche d').
Nous avons utilisé notre Logiciel DMS Réingénierie des outils pour mettre en œuvre exactement ce pour le code Java, par l'analyse de tous les compilation-unités impliquées à la fois, la construction de tables de symboles pour tout et à chercher toutes les références. Un haut niveau de définition, sans références et sans prétention d'être une API externe de l'élément est mort. Cet outil est également automatiquement supprime le code mort, et à la fin, vous pouvez choisir ce que vous voulez: le rapport de morts entités, ou le code dépouillé de ces entités.
DMS analyse également en C++ dans une variété de dialectes (EDITION Février 2014: y compris MS et les versions de C++14 [MODIFIER Nov 2017: maintenant, C++17]) et crée toutes les tables de symboles. Suivi de la mort de références serait simple à partir de ce point. DMS pourrait également être utilisé pour la bande de sortir. Voir http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html
Bullseye outil de couverture pourrait l'aider. Il n'est pas gratuite mais.