web-dev-qa-db-fra.com

Existe-t-il des outils pour déterminer la similitude du code?

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

37
siljoy

Lorsque j'enseignais le génie logiciel, j'ai utilisé le service (gratuit) à Stanford appelé MOSS (Mesure de la similitude des logiciels). Cela m'a permis de détecter le plagiat entre les projets des étudiants Le système m'a également permis de saisir des exemples de code "connus" que j'avais utilisés pendant le cours et qui devaient être ignorés.

La grande chose (complètement un problème secondaire) sur les résultats qui sont revenus était que nous pouvions dire quels étudiants travaillaient ensemble --- même s'ils ne copiaient pas le code de manière flagrante, ils discutaient suffisamment des problèmes pour que leur code soit similaire. La partie triste était de trouver l'étudiant étrange sans aucune similitude avec tout autre code. Ils ne faisaient généralement pas si bien.

10
Peter K.

Vous pourrez peut-être utiliser outil PMD pour trouver ce que vous cherchez. Il est destiné à détecter le copier-coller dans une base de code, mais si vous incluez la source de projet Origin suspecte, cela pourrait vous aider à voir où le code a été copié à partir de celui-ci.

8
busyspin

La chose la plus proche que je sache de ce que vous recherchez est Clone Detective. Il s'agit d'un plug-in Visual Studio.

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

5
epotter

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

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

4
Matthew Rodatus

Même si vous ne parlez pas d'un outil de diff, vous pouvez toujours en utiliser un pour cela, dans une certaine mesure au moins. Si je vois deux sections de code qui se ressemblent, par exemple, je les colle souvent dans BeyondCompare pour voir combien de travail il faudrait pour le simplifier en refactorisant les fonctionnalités communes.

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

1
Mason Wheeler

Cette article sur wikipedia sur le sujet comprend également des liens vers plusieurs outils qui peuvent être utilisés pour trouver du code similaire ou en double. Nous avons un outil interne pour cela, donc je ne connais pas les outils externes mentionnés dans l'article.

1
Alan

J'aime vraiment comment CCFinderX visualise la similitude, donc vous voudrez peut-être vérifier celle-là aussi. Prend en charge un certain nombre de langues, il est gratuit et assez facile à configurer (Python 2.6).

1
MaR

Ce que vous voulez vraiment faire, c'est voir s'il y a du code cloné (copié) entre les deux projets (les deux projets étant constitués éventuellement 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 clone de ligne source exacts. Je pense que PMD en fait partie. Ce que cela ne fera pas, c'est trouver du code qui est édité par copier-coller; ils trouveront du code passe-partout inchangé copié-collé probablement enroulé autour des trucs copiés-édités.

Si vous voulez voir les détails de la copie pour copier-éditer le code, vous avez besoin d'un détecteur de clone qui trouve les clones "paramétrés". Les détecteurs basés sur des jetons le font pour les modifications qui remplacent uniquement les noms de variables ou les constantes.

Les détecteurs basés sur un arbre de syntaxe abstraite (AST) le font pour les modifications impliquant de plus gros morceaux, tels que les expressions, les instructions, les insertions, les 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 informatique comme guide.

Notre CloneDR outil est un tel détecteur.

Je ne connais pas d'outils qui trouveront réellement du code "équivalent" (conditions inversées), etc.

1
Ira Baxter