2012-06-06 10 views
14

Sono alla ricerca di uno strumento che possa confrontare i codici sorgente per la somiglianza.Rilevatore codice simile

Abbiamo un sistema molto banale in questo momento che ha un'enorme quantità di falsi positivi e i veri positivi possono facilmente essere seppelliti in essi.

miei requisiti sono:

  • ragionevolmente piccola quantità di falsi positivi
  • buon tasso di rilevamento (yeah questi stanno andando contro l'altro)
  • idealmente con una potenza più complesso di un singolo valore
  • utilizzabile per C (C99) e C++ (C++ 03 e in modo ottimale C++ 11)
  • ancora mantenuto
  • utilizzabile per co mparing due file sorgente contro l'altro
  • utilizzabile in modalità non-interattiva

EDIT:

Per evitare confusione, i seguenti due frammenti di codice sono identici e devono essere rilevati come tali:

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

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

Lo stesso qui:

int x = 10; y = x + 5;

int a = 10; y = a + 5;

+1

Il diff soddisfa alcune delle vostre esigenze? –

+1

@HighPerformanceMark LOL, no non lo fa. –

+2

sembra che tu voglia uno strumento che paragona la somiglianza semantica di 2 codici, piuttosto che sintattico. Sospetto che questo sia un problema irrisolto e che SO lotterà per trovare una soluzione soddisfacente per te. Penso che, come scritto, la tua domanda originale possa ingannare molti lettori proprio come mi ha fuorviato. Penso anche che dovresti riscriverlo completamente per indicare chiaramente in che tipo di confronto sei interessato. –

risposta

15

Ho usato MOSS in passato: http://theory.stanford.edu/~aiken/moss/ per rilevare il codice plagiato. Dal momento che funziona su un livello semantico, rileverà le situazioni che hai presentato sopra. Lo strumento è orientato alla lingua, quindi i commenti non vengono considerati nell'analisi e fa molto per scoprire il codice che è stato modificato attraverso la semplice ricerca e sostituzione di nomi di variabili e/o di funzioni.

Nota: ho utilizzato lo strumento alcuni anni fa quando insegnavo informatica alla scuola elementare e ha funzionato meravigliosamente nel rilevamento del codice che era stato strappato da Internet. Ecco un resoconto ben documentato di un'applicazione simile: http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

Se google "software misura di similarità", si dovrebbe trovare un paio di colpi più utili: http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

+0

Sembra che il link a fie1012.org non sia più valido. Potresti fornire un link alternativo? – Eric

+1

Prova questo: http://www3.nd.edu/~kwb/nsf-ufe/1110.pdf – Throwback1986

3

Può essere copia-incolla-rilevatore dalla PMD?

6

Il tuo problema nella terminologia informatica potrebbe essere indicato come rilevamento del plagio del codice sorgente. Un buon inizio sarebbe leggere questo articolo su Dr Dobbs: Detecting Source-Code Plagiarism. Elenca gli algoritmi per rilevare il plagio nel codice sorgente.

Nota: Cosa avete chiesto è davvero un problema difficile calcolo :)

1

Si potrebbe provare duplo. Troverà linee comuni. Ha una certa capacità di ignorare le modifiche agli spazi bianchi, ma non rileva il codice con variabili rinominate, quindi è più un aiuto alla pulizia che un aiuto quando si rileva un plagio.

1

Inizio a utilizzare JPLAG (https://github.com/jplag/jplag) per controllare la somiglianza del codice e confrontare i lavori degli studenti in Java e file di testo. Funziona bene per controllare la stessa struttura del codice e la sostituzione della variabile.

Problemi correlati