web-dev-qa-db-fra.com

Détecteur de code similaire

Je recherche un outil permettant de comparer les codes sources pour la similarité.

Nous avons actuellement un système très trivial qui contient une énorme quantité de faux positifs et les vrais positifs peuvent facilement s'y enfouir.

Mes exigences sont:

  • quantité relativement faible de faux positifs
  • bon taux de détection (oui, ils vont l'un contre l'autre)
  • idéalement avec une sortie plus complexe qu'une seule valeur
  • utilisable pour C (C99) et C++ (C++ 03 et de manière optimale C++ 11)
  • toujours maintenu
  • utilisable pour comparer deux fichiers sources l'un par rapport à l'autre
  • utilisable en mode non interactif

MODIFIER:

Pour éviter toute confusion, les deux extraits de code suivants sont identiques et doivent être détectés comme tels:

for (int i = 0; i < 10; i++) { bla; }

int i; while (i < 10) { bla; i++; }

Pareil ici:

int x = 10; y = x + 5;

int a = 10; y = a + 5;

15
Let_Me_Be

J'ai déjà utilisé MOSS: http://theory.stanford.edu/~aiken/moss/ pour détecter le code plagié. Comme cela fonctionne au niveau sémantique, il détectera les situations que vous avez présentées ci-dessus. L'outil prend en charge la langue. Par conséquent, les commentaires ne sont pas pris en compte dans l'analyse et il permet de détecter le code modifié par simple recherche-remplacement des noms de variables et/ou de fonctions.

Remarque: j’avais utilisé cet outil il ya quelques années lorsque j’avais enseigné l’informatique à l’université, et il a fonctionné à merveille pour détecter le code qui avait été retiré d’Internet. Voici un récit bien documenté d'une application similaire: http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

Si vous recherchez une "similarité logicielle" avec Google, vous devriez trouver quelques autres résultats utiles: http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

16
Throwback1986

Votre problème en terminologie informatique peut être défini comme détection de plagiat de code source. Un bon début serait de lire cet article sur le Dr Dobbs: Détecter le plagiat de code source . Il répertorie les algorithmes de détection de plagiat dans le code source.

Remarque: ce que vous avez demandé est en effet un problème informatique difficile :)

6
Yavar

Peut-être copier-coller-détecteur de PMD ?

3
Kirill

Je commence à utiliser JPLAG ( https://github.com/jplag/jplag ) pour vérifier la similarité des codes et comparer les travaux des étudiants en Java et en fichiers texte. Cela fonctionne bien de vérifier la même structure de code et la même variable de substitution. 

1
Pierre Jean

Vous pouvez essayer duplo . Il trouvera des lignes communes. Il a une certaine capacité à ignorer les changements d’espace, mais ne détecte pas le code avec des variables renommées. Il s’agit donc d’un moyen de nettoyage plutôt que d’une aide lors de la détection de plagiat.

1
Benjamin Bannier