Existe-t-il des outils pour déterminer la similarité de code? [fermé]


37

Je ne parle pas d'un outil de diff. Je cherche vraiment à savoir si un projet contient du code qui pourrait avoir été "refactoré" à partir d'un autre projet. Il serait probable que les noms de fonction, les noms de variables et autres soient modifiés. Les conditions peuvent être inversées, etc.


5
Est-ce pour une classe ou quelque chose?
TheLQ

1
@TheLQ - Je peux penser à plus d'un cas en dehors d'une salle de classe où je suis allé à la chasse pour voir où le "copier-coller" est réutilisé, n'est-ce pas? brigade a traversé.
MIA

N'oubliez pas l' Atomiq de Steve Smith .
Jim G.

Les commentaires et les messages de sortie (tels que les erreurs, etc.) peuvent souvent mieux coder les empreintes digitales que le code réel.
Bork Blatt

Ils nous ont toujours menacé de le faire chez Uni, il serait intéressant de voir si un tel outil existait réellement.
Jake

Réponses:


10

Lorsque j'enseignais le génie logiciel, j'utilisais le service (gratuit) de Stanford appelé MOSS (Measure of Software Similarity). Cela m'a permis de détecter très facilement le plagiat entre les projets des étudiants. Le système m'a également permis d'entrer des exemples de code "connus comme bons" que j'avais utilisés pendant le cours et qui devaient être ignorés.

Le bon côté des résultats obtenus est que nous pouvions savoir quels étudiants travaillaient ensemble. Même s'ils ne copiaient pas le code de façon flagrante, ils discutaient suffisamment des problèmes pour que leur code soit similaire. La partie triste était de trouver l'étudiant étrange avec AUCUNE SIMILARITÉ à un autre code. Ils ne faisaient généralement pas si bien.


Merci, je cherchais quelque chose d'exactement comme ça :)
Ulrich Dangel

8

Vous pourrez peut-être utiliser l' outil PMD pour trouver ce que vous recherchez. Il est conçu pour détecter les copier-coller dans une base de code, mais si vous incluez la source du projet d'origine suspectée, cela peut vous aider à voir où le code a été copié.


Oui, nous utilisons le CPD de PMD dans notre code
JoseK le

Mais PMD est uniquement pour Java, non?
Janusz Lenar

5

La chose la plus proche que je connaisse de ce que vous recherchez est Clone Detective. C'est un plug-in Visual Studio.

Clone Detective est une intégration Visual Studio qui vous permet d'analyser des projets C # pour le code source dupliqué ailleurs. Les doublons peuvent facilement entraîner des incohérences et constituent souvent un indicateur de code mal factorisé.


4

Il semble que vous souhaitiez calculer la différence entre deux arbres de syntaxe abstraite (AST), de sorte que vous pourriez être intéressé par l' outil Smart Differencer .

Trouvé sur https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff .


(Merci pour le compliment à mon outil). SmartDifferencer détecte les différences entre une paire de fichiers spécifique; la similarité est le complément des différences, donc je conviens que c'est en quelque sorte la bonne idée. Cependant, il vous faut identifier une paire de fichiers pour la donner, ce qui est pénible si vos systèmes sont composés de nombreux fichiers. Ce qui est vraiment nécessaire, c’est ce complément: trouvez la similitude et faites-le sans identifier personnellement les paires de fichiers. Voir ma réponse CloneDR dans ce même fil pour un tel outil. Oui, il utilise une technologie connexe.
Ira Baxter

1

Même si vous ne parlez pas d'un outil de différenciation, vous pouvez toujours en utiliser un pour cela, du moins dans une certaine mesure. Si je vois deux sections de code qui se ressemblent, par exemple, je les colle souvent dans BeyondCompare pour voir le travail que cela représenterait pour le simplifier en remaniant la fonctionnalité commune.

D'un autre côté, si vous ne savez pas où se trouve un code similaire, mais que vous vous demandez s'il en existe un quelque part ... que cherchez-vous? Un outil automatisé pour détecter le plagiat? Je ne suis pas sûr qu'une telle chose existe.


Si tel était le cas, SCO aurait peut-être gagné contre IBM :-)

1

Cet article sur wikipedia sur le sujet inclut également des liens vers plusieurs outils pouvant être utilisés pour trouver du code similaire ou en double. Nous avons un outil interne pour cela, donc je ne suis pas familier avec les outils externes mentionnés dans l'article.


1

Ce que vous voulez vraiment faire, c'est voir s'il y a du code cloné (copié) dans les deux projets (les deux projets consistant éventuellement en de grands ensembles de fichiers). Vous pouvez le faire en exécutant un outil de détection de clone. Wikipedia en répertorie une variété.

Pour décider grossièrement s'il y a beaucoup de copie, il vous suffit de faire correspondre les lignes source et il existe une variété de détecteurs de clones de ligne source identiques. Je pense que PMD est l'un d'entre eux. Ce qu'ils ne feront pas, c'est de trouver du code copié-collé-édité; ils trouveront un code standard inchangé, copié-collé, probablement enroulé autour du contenu édité copié-copié.

Si vous voulez voir les détails de la copie pour le code copier-coller-éditer, vous avez besoin d'un détecteur de clone qui trouve des clones "paramétrés". Les détecteurs à base de jetons font cela pour les éditions qui ne remplacent que les noms de variables ou les constantes.

Les détecteurs basés sur l’arbre de syntaxe abstraite (AST) effectuent cette opération pour les éditions impliquant des fragments plus volumineux, tels que des expressions, des instructions, des insertions, des suppressions, etc. Ces derniers ont tendance à donner de meilleures réponses car, contrairement aux détecteurs de jetons, ils peuvent utiliser la structure linguistique du code source de l'ordinateur comme guide.

Notre outil CloneDR est un tel détecteur.

Je ne connais pas d'outils qui trouveront un code "équivalent" (conditionnels inversés), etc. Les chercheurs ont construit des détecteurs de clones qui font ce genre de choses, mais la combinatoire rend cette exécution très coûteuse et les prototypes de recherche mal dimensionnés.


1

J'aime beaucoup la façon dont CCFinderX visualise la similarité, vous devriez donc peut-être aussi vérifier celle-ci. Prend en charge un certain nombre de langues, il est gratuit et assez facile à installer (Python 2.6).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.