82 votes

Comment détecter la duplication de code en cours de développement?

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

Dans l'idéal, ce serait quelque chose que les développeurs peuvent utiliser au cours du développement, plutôt que de simplement courir occasionnellement pour voir où sont les problèmes. Il serait bien aussi si on pouvait intégrer un tel outil avec CruiseControl pour donner un rapport après chaque enregistrement.

J'ai eu un coup d'oeil à Duploc il y a quelques temps, il a montré un beau graphique, mais nécessite un environnement smalltalk à utiliser, qui permet de faire tourner automatiquement plutôt difficile.

Outils gratuits serait bien, mais si il y a quelques bons outils commerciaux je serais également intéressé.

36voto

Simon Steele Points 8344

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

Mise à jour: fonctionne Aussi avec Java, C#, C, COBOL, Ruby, JSP, ASP, HTML, XML, Visual Basic, Groovy code source et même les fichiers de texte brut

20voto

user39039 Points 131

J'ai utilisé de la PMD est un Copier-Coller de-Détecteur et intégré dans CruiseControl en utilisant le wrapper suivant script (assurez-vous d'avoir la dgm jar dans le classpath).

Notre check lieu tous les soirs. Si vous souhaitez limiter la sortie à la liste uniquement les fichiers à partir de la variation de courant définie, vous pourriez avoir besoin de certains de programmation personnalisée (idée: vérifier tous et uniquement la liste des doublons où l'un des fichiers modifiés est impliqué. Vous devez vérifier tous les fichiers parce qu'un changement pourrait utiliser un peu de code à partir d'un non-fichier modifié). Devrait être faisable en utilisant XML de sortie et de l'analyse du résultat. N'oubliez pas de poster le script quand c'est fait ;)

Pour commencer, le "Texte" de sortie devrait être ok, mais vous souhaitez afficher les résultats dans une interface conviviale, pour laquelle j'utilise un script perl pour générer des fichiers HTML à partir de la "xml" de sortie de la CPD. Ceux-ci sont accessibles en les publiant sur le tomcat où croisière rapports jsp réside. Les développeurs peuvent les consulter à partir de là et de voir les résultats de leur sale piratage :)

Il fonctionne très rapide, moins de 2 secondes sur 150 KLoc code (les lignes vides et les commentaires ne sont pas comptés dans ce numéro).

duplicatecheck.xml:

<project name="duplicatecheck" default="cpd">

<property name="files.dir" value="dir containing your sources"/>
<property name="output.dir" value="dir containing results for publishing"/>

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask"/>
    <cpd minimumTokenCount="100" 
         language="cpp" 
         outputFile="${output.dir}/duplicates.txt"
         ignoreLiterals="false"
         ignoreIdentifiers="false"
         format="text">
        <fileset dir="${files.dir}/">
            <include name="**/*.h"/>
            <include name="**/*.cpp"/>
                <!-- exclude third-party stuff -->
            <exclude name="boost/"/>
            <exclude name="cppunit/"/>
        </fileset>
    </cpd>
</target>

6voto

benno Points 934

duplo semble être un C mise en œuvre de l'algorithme utilisé dans Duploc. Il est simple à compiler et à installer, et, tandis que les options sont limitées, il semble plus ou moins de travail out-of-the-box.

4voto

Andy Lester Points 34051

Regardez la PMD projet.

Je n'ai jamais utilisé, mais ont toujours voulu.

2voto

Ira Baxter Points 48153

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

De nombreux clone détecteurs de travail en comparant les lignes de source, et que la seule copie exacte de code.

CCFinder, ci-dessus, fonctionne en comparant la langue jetons, de sorte qu'il n'est pas sensible à l'espace blanc les changements. Il peut détecter les clones qui sont des variantes le code original si il y a un seul jeton les changements (e.g, le changement d'une variable X à Y dans le clone).

Idéalement ce que vous voulez, c'est la-dessus, mais la capacité pour trouver des clones où les variations sont autorisés à être relativement arbitraire, par exemple, remplacer une variable par une expression, une déclaration par un bloc, etc.

Notre CloneDR clone détecteur ne ce pour Java, C#, C++, COBOL, VB.net, VB6, Fortran et une variété d'autres langues. Il peut être vu à: http://www.semdesigns.com/Products/Clone/index.html

Ainsi que d'être en mesure de gérer plusieurs langues, CloneDR moteur est capable de traiter une variété d'encodage en entrée de styles, y compris ASCII, ISO-8859-1, UTF8, UTF16, EBCDIC, un certain nombre de Microsoft encodages, et (Japonais) Shift-JIS.

Le site dispose de plusieurs clone de détection d'exécuter l'exemple des rapports, dont l'un pour le C++.

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