2010-11-19 7 views
11

Existe-t-il des outils permettant de déterminer si une fonction/procédure/méthode/classe entière est utilisée? J'ai vu des outils qui peuvent aider un développeur expérimenté à retrouver des fragments de code inutilisés (la plupart sont pour des langages autres que Delphi) mais la plupart ont une courbe d'apprentissage abrupte et/ou nécessitent un creusement considérable pour déterminer si un fragment de code est utilisé ou non.Recherche de code inutilisé (aka "mort") dans Delphi

L'éditeur de liens intelligents de Delphi le fait pour réduire la taille de l'exécutable final. Malheureusement, le peu d'informations fournies sur l'éditeur de liens intelligents n'indique pas un moyen de récupérer ce qui a été retiré de l'obstacle. Certes, même s'il est possible de savoir ce que le linker intelligent est en train d'éliminer, il peut être très conservateur avec son abattage sélectif.

Répondre

5

Bien que maladroit et non global, vous pouvez examiner le code source des points dans la marge, comme illustré ci-dessous. Ce sont des lignes sur lesquelles vous pouvez définir des points d'arrêt car le code n'a pas été éliminé.

Cela se produit, je crois, au niveau de la procédure. Je ne connais pas un moyen de déterminer cela à un niveau moins grossier.

alt text

+0

En effet maladroit. Cela nécessiterait un examen visuel de chaque fichier source pour détecter les points manquants. Bien que, après avoir testé quelques options du compilateur, il semble que cette fonctionnalité soit disponible, que les informations de débogage soient activées ou désactivées. Je me demande si cette information est extraite par l'IDE du dcus? –

+0

maladroit, mais très utile lorsque vous essayez de comprendre ou de refactoriser de grandes unités. –

4

Ce fil traite la suppression des unités inutilisées, et parle des outils comme Icare Pascal Analyzer. Cet outil fera tout ce dont vous avez besoin et plus encore. How to "automatically" remove unused units from uses clause?

+0

Juste utilisé que 2 jours auparavant et épluché d'une manière une couche épaisse de merde de mon code. –

+1

Oui, ses rapports * Code Reduction * et * Uses * sont plutôt utiles, mais ils ne contiennent pas de rapport répertoriant les fonctions qui ne sont jamais appelées ou les classes déclarées mais jamais utilisées. –

0

Contrôlez les outils au http://www.peganza.com/ pour vous aider dans l'exécution de certaines de vos tâches.

Icarus est un freeware et il analyse vos clauses 'uses' pour vous permettre de supprimer les références inutilisées. Pascal Analyzer est la version complète qui inclut la fonctionnalité Icarus et une tonne d'autres outils.

+0

Ceux-ci ont déjà été mentionnés. –

+0

Oups ... ne sais pas comment je l'ai manqué! Bonne chance malgré tout! –

0

Peut-être CodeHealer pourrait vous aider avec le code utilisé

CodeHealer effectue une analyse approfondie du code source, à la recherche problèmes dans les domaines suivants:

Vérifications: règles de contrôle de la qualité tel que le code inutilisé ou inaccessible, l'utilisation de noms de directive Delphi et mots-clés comme identifiants, identifiants cachant d'autres du même nom à une portée plus élevée, et plus. Contrôles: erreurs potentielles telles que uninitialised ou non référencées identificateurs, coulée de type dangereux, conversions de type automatique, des valeurs non définies de retour de la fonction , les valeurs inutilisées affectées , et plus encore. Metrics: Quantification des propriétés de code tels que cyclomatique complexité, le couplage, un commentaire rapport , de nombre de classes, de lignes de code entre les objets (données) Abstraction couplage, et plus encore.

2

Vous pouvez utiliser un outil Code Coverage pour trouver le code inutilisé.Il suffit de lancer l'application et d'exécuter toutes les parties manuellement. Le rapport de couverture de code indiquera quelles parties n'ont pas été touchées. (Exécuter l'outil sur les tests unitaires n'est pas utile car le code inutilisé peut encore avoir des tests unitaires).

Un outil de couverture de code gratuit (open source) pour Delphi est disponible here. Après l'avoir exécuté, vérifiez les lignes rouges dans les rapports, ce sont les lignes qui n'ont pas été atteintes.

code Delphi couverture est un simple code outil de couverture pour Delphi qui crée rapports de couverture de code basé sur détaillées des fichiers MAP.

Pour chaque unité, il y aura un unit.html un résumé de la couverture , suivie par la source balisée. Les lignes vertes étaient couvertes. Les lignes rouges n'étaient pas des lignes couvertes. Les autres lignes n'ont pas généré le code pour cela. Il y a aussi un CodeCoverage_summary.html fichier que résume la couverture et a des liens aux rapports d'unité générés.

Peut-être que l'auteur peut ajouter une fonctionnalité de «recherche de code mort» dans une prochaine version.

+5

Bonne approche, mais il est difficile d'exploiter pleinement de nombreuses applications grandes/matures/spaghetti/legacy/merdique, comme celles généralement trouvées sur les projets de maintenance (qui sont généralement ceux soupçonnés d'avoir du code mort). Bien sûr, un test de régression entièrement automatisé A..Z serait utile. Vous savez, le type qui simule des ensembles de données et des enregistrements avec chaque combinaison de propriétés étranges, simulant la fin d'année, le quart de fin, l'année bissextile, l'éclipse solaire, le traitement des vacances, fonctionne comme administrateur (niveau d'application), utilisateur régulier, invité (OS) admin, utilisateur régulier, utilisateur privilégié, compte limité. XP, 95, Vista, 7 ... –

+0

suite ... Et puis, il y a toutes les choses que j'ai, en tant que développeur, je n'ai même pas IDEA dans le programme. Ça a l'air fou, si vous n'avez pas été là. +1, malgré ma diatribe ... ;-) –

0

Pour les unités, utilisez Pascal Analyzer. Vous devrez peut-être l'utiliser plusieurs fois.

Pour les objets/classes qui sont enregistrés dans les usines de classe (et autres), vous devrez effectuer une double vérification manuelle, car ils seront entièrement compilés. La raison en est que le compilateur ne sait pas si vous effectivement les utiliser ou non.

Pour les méthodes, vous devez vérifier les points bleus. Pas très pratique, donc il y a une autre façon (d'après ce qu'on m'a dit quand j'étudie le même sujet). Vous devez effectuer une génération complète avec un fichier map détaillé activé. Une fois cela fait, vous devez comparer la source pour voir s'il y a une entrée dans le fichier de carte. Si ce n'est pas le cas, le code n'est pas compilé dans le code éventuellement mort (peut-être parce que si c'est un composant, il se peut que vous n'utilisiez pas cette fonctionnalité).

+0

L'utilisation du fichier map est une idée intéressante. Si je pouvais trouver un moyen de générer une liste de toutes les méthodes et sous-routines de première classe dans une base de code, extraire la liste des segments de la section * Publics by Name * dans le fichier map et comparer les deux. ont été exclus par l'éditeur de liens. –

0

Dans le passé, j'ai compilé des sources avec Free Pascal en utilisant la fonctionnalité «Générateur d'assembleur», puis j'ai créé quelques programmes de filtrage simples qui fonctionnent sur la source. (Pour ce bit est utile de savoir que Smartlinking est effectuée à l'aide « section » éditeur de liens granularité)

Il vous donne parfois des idées pourquoi certaines choses ne sont pas smartlinked sur (par exemple, parce qu'il est une référence dans une table qui pourrait être accédé par quelque chose dans une initialisation)

Bien sûr, Delphi n'est pas FPC, mais quand vous avez des indices sur ce qu'il faut rechercher, il s'agit de regarder les points dans la marge après une compilation Delphi pour voir si elle est connectée intelligemment ou pas. De même, si vous vous demandez pourquoi certains codes n'ont pas été connectés de manière intelligente, analyser un petit exemple de programme compilé en assembleur avec FPC peut rendre la raison évidente. (par exemple.vous trouvez des tables RTTI avec une référence à celui-ci)

La route FPC permet une route systématique pour rechercher des candidats pour de tels tests.

Questions connexes