Comment détecter la duplication de code pendant le développement?

Nous avons une base de code assez grande, 400K LOC de C ++, et la duplication de code est un problème. Existe-t-il des outils permettant de détecter efficacement les blocs de code dupliqués?

Idéalement, ce serait quelque chose que les développeurs pourraient utiliser pendant le développement plutôt que de simplement exécuter occasionnellement pour voir où sont les problèmes. Ce serait aussi bien si nous pouvions intégrer un tel outil avec CruiseControl pour donner un rapport après chaque enregistrement.

J’ai jeté un coup d’oeil à Duploc il y a quelque temps, il a montré un bon graphique, mais nécessite un environnement smalltalk pour l’utiliser, ce qui rend l’exécution assez difficile.

Des outils gratuits seraient bien, mais s’il y a de bons outils commerciaux, je serais également intéressé.

    Simian détecte le code en double dans les projets C ++.

    Mise à jour: Fonctionne également avec le code source Java, C #, C, COBOL, Ruby, JSP, ASP, HTML, XML, Visual Basic et même les fichiers texte brut

    J’ai utilisé Copy-and-Paste-Detector de PMD et je l’ai intégré à CruiseControl en utilisant le script wrapper suivant (veillez à avoir le fichier pmd dans le classpath).

    Notre contrôle a lieu tous les soirs. Si vous souhaitez limiter la sortie pour ne lister que les fichiers de l’ensemble de modifications en cours, vous aurez peut-être besoin d’une programmation personnalisée (idée: cocher tout et lister uniquement les doublons où l’un des fichiers modifiés est impliqué). un code d’un fichier non modifié). Devrait être faisable en utilisant la sortie XML et l’parsing du résultat. N’oubliez pas de poster ce script quand c’est fait;)

    Pour les débutants, la sortie “Text” devrait être correcte, mais vous voudrez afficher les résultats de manière conviviale, pour laquelle j’utilise un script perl pour générer des fichiers HTML à partir de la sortie “xml” de CPD. Celles-ci sont accessibles en les publiant sur le tomcat où se trouve le rapport de croisière jsp. Les développeurs peuvent les voir à partir de là et voir les résultats de leur sale piratage 🙂

    Il tourne assez vite, moins de 2 secondes sur le code 150 KLoc (lignes vides et commentaires non comptabilisés dans ce numéro).

    duplicatecheck.xml :

                   

    duplo semble être une implémentation en C de l’algorithme utilisé dans Duploc. Il est simple à comstackr et à installer, et même si les options sont limitées, il semble plus ou moins prêt à l’emploi.

    Regardez le projet PMD .

    Je ne l’ai jamais utilisé, mais j’ai toujours voulu le faire.

    Pour ma future référence, ces paquets Debian semblent faire quelque chose dans ce sens:

    • testeur de similarité (également connu sous le nom de logiciel et testeur de similarité de texte SIM )

    • simhash

    J’aurais pu jurer que d’autres paquetages étaient encore plus pertinents, mais je ne les trouve pas pour le moment. (C’est pourquoi j’énumère mes résultats ici cette fois-ci: pour me donner une chance de pouvoir les retrouver!)

    PS Il semble vraiment qu’il devrait y avoir une balise debtags pour tous les outils liés à la recherche de duplication [proche]. (Mais comment cela s’appellerait-il?)

    Eh bien, vous pouvez exécuter un détecteur de clone sur votre base de code source chaque nuit.

    De nombreux détecteurs de clones fonctionnent en comparant les lignes source et ne peuvent trouver que le code exact en double.

    CCFinder, ci-dessus, fonctionne en comparant les jetons de langue, de sorte qu’il n’est pas sensible aux changements d’espace blanc. Il peut détecter les clones qui sont des variantes du code d’origine s’il n’y a qu’un seul changement de jeton (par exemple, changer une variable X en Y dans le clone).

    Idéalement, ce que vous voulez, c’est ce qui précède, mais la capacité de trouver des clones où les variations peuvent être relativement arbitraires, par exemple, remplacer une variable par une expression, une déclaration par un bloc, etc.

    Notre détecteur de clones CloneDR le fait pour Java, C #, C ++, COBOL, VB.net, VB6, Fortran et une variété d’autres langages. On peut le voir sur: http://www.semdesigns.com/Products/Clone/index.html

    En plus de pouvoir gérer plusieurs langues, le moteur CloneDR est capable de gérer une variété de styles d’encodage, notamment ASCII, ISO-8859-1, UTF8, UTF16, EBCDIC, un certain nombre de codages Microsoft et de JIS.

    Le site dispose de plusieurs exemples de rapports de détection de clones, dont un pour C ++.

    EDIT Feb 2014: gère maintenant tout C ++ 14.

    CCFinderX est un détecteur de code cloné gratuit (à usage interne) qui prend en charge plusieurs langages de programmation (Java, C, C ++, COBOL, VB, C #).

    Trouver des extraits de code “identiques” est relativement facile, il existe déjà un outil qui le fait (voir les autres réponses).

    Parfois, c’est une bonne chose, parfois ce n’est pas le cas. il peut ralentir le temps de développement s’il est effectué à un “niveau” trop fin; c.-à-d. essayer de refactoriser autant de code, vous perdez votre objective (et probablement vos étapes et vos calendriers).

    Ce qui est plus difficile est de trouver plusieurs fonctions / méthodes qui font la même chose mais avec des entrées et / ou un algorithme différents (mais similaires) sans documentation appropriée.

    Si vous avez deux ou différentes méthodes pour faire la même chose et que le programmeur essaie de réparer une instance mais que vous oubliez (ou ne sait pas qu’elles existent) les autres, vous augmenterez le risque pour votre logiciel.

    Same ( http://sourceforge.net/projects/same/ ) est extrêmement simple, mais fonctionne sur les lignes de texte plutôt que sur les jetons, ce qui est utile si vous utilisez un langage qui n’est pas pris en charge par l’un des clones les plus sophistiqués. trouveurs.

    ConQAT est un excellent outil qui supporte l’parsing de code C ++. Peut trouver des doublons en ignorant les espaces. Possède des interfaces gui et console extrêmement maniables. En raison de sa flexibilité, il n’est pas facile à configurer. J’ai trouvé cet article de blog très utile pour configurer un projet c ++ .

    Vous pouvez utiliser notre outil SourceMeter pour détecter la duplication de code. C’est un outil de ligne de commande (très similaire aux compilateurs), vous pouvez donc l’intégrer facilement dans des outils d’continuous integration, comme CruiseControl , ou Jenkins .

    Il y a aussi Simian qui supporte Java, C #, C ++, C, Objective-C, JavaScript …

    Il est soutenu par Hudson (comme CPD).

    Sauf si vous êtes un projet open source, vous devez payer pour Simian.

    TeamCity dispose d’un puissant moteur de duplication de code pour .NET et Java, qui peut s’exécuter sans effort dans le cadre de votre système de construction.