it-swarm.it

Esistono strumenti per determinare la somiglianza del codice?

Non sto parlando di uno strumento diff. Sto davvero cercando di vedere se un progetto contiene codice che potrebbe essere stato "refactored" da un altro progetto. Sarebbe probabile che i nomi delle funzioni, i nomi delle variabili e quant'altro sarebbero cambiati. I condizionali potrebbero essere invertiti, ecc.

37
siljoy

Quando insegnavo ingegneria del software, ho usato il servizio (gratuito) a Stanford ha chiamato MOSS (Misura della somiglianza software). Questo mi ha permesso di rilevare il plagio tra i progetti degli studenti molto facilmente Il sistema mi ha anche permesso di inserire esempi di codice "conosciuti buoni" che avevo usato durante la lezione che dovevo essere ignorato.

La cosa grandiosa (completamente una questione secondaria) sui risultati che sono tornati è stata la possibilità di dire quali studenti hanno lavorato insieme --- anche se non hanno copiato apertamente il codice, hanno discusso abbastanza dei problemi che il loro codice era simile. La parte triste era trovare lo studente strano senza NESSUNA SIMILARITÀ con qualsiasi altro codice. Di solito non hanno fatto così bene.

10
Peter K.

Potresti essere in grado di utilizzare strumento PMD per trovare quello che stai cercando. Ha lo scopo di rilevare taglia e incolla all'interno di una base di codice, ma se includi la fonte sospetta del progetto Origin potrebbe aiutarti a vedere da dove è stato copiato il codice.

8
busyspin

La cosa più vicina che conosco a ciò che stai cercando è Clone Detective. È un plug-in di Visual Studio.

Clone Detective è un'integrazione di Visual Studio che consente di analizzare progetti C # per il codice sorgente duplicato altrove. Avere duplicati può facilmente portare a incoerenze e spesso è un indicatore di codice scarsamente ponderato.

5
epotter

Sembra che tu voglia calcolare la differenza tra due alberi di sintassi astratti (AST), quindi potresti essere interessato allo strumento Smart Differencer .

Trovato su https://stackoverflow.com/questions/974855/Eclipse-abstract-syntax-tree-diff .

4
Matthew Rodatus

Anche se non stai parlando di uno strumento diff, puoi comunque usarne uno, almeno in una certa misura. Se vedo due sezioni di codice che sembrano simili, ad esempio, spesso incollo entrambe in BeyondCompare per vedere quanto lavoro sarebbe per semplificarlo rifattorizzando la funzionalità comune.

D'altra parte, se non sai dove si trova il codice simile, ma ti stai solo chiedendo se esiste qualcosa da qualche parte ... cosa stai cercando? Uno strumento automatizzato per rilevare il plagio? Non sono sicuro che esista qualcosa del genere.

1
Mason Wheeler

Questo articolo su wikipedia sull'argomento include anche collegamenti a diversi strumenti che possono essere utilizzati per trovare codice simile o duplicato. Abbiamo uno strumento interno per questo, quindi non ho familiarità con gli strumenti esterni menzionati nell'articolo.

1
Alan

Mi piace molto come CCFinderX visualizza la somiglianza, quindi potresti voler controllare anche quello. Supporta alcune lingue, è gratuito e abbastanza facile da installare (Python 2.6).

1
MaR

Quello che vuoi davvero fare è vedere se c'è un codice clonato (copiato) tra i due progetti (entrambi i progetti consistono in possibilmente grandi set di file). Puoi farlo eseguendo uno strumento di rilevamento dei cloni. Wikipedia ne elenca una varietà.

Per decidere grossolanamente se ci sono molte copie, devi solo abbinare le linee di origine e ci sono una varietà di rilevatori di cloni della linea di origine esatti là fuori. Credo che PMD sia uno di questi. Ciò che questi non faranno è trovare il codice che è stato modificato in copia-incolla; troveranno il codice invariato copia-incolla di boilerplate probabilmente racchiuso tra le cose modificate in copia.

Se si desidera visualizzare i dettagli della copia per il codice copia-modifica-modifica, è necessario un rilevatore di cloni che trova cloni "parametrizzati". I rilevatori basati su token lo fanno per le modifiche che sostituiscono solo i nomi delle variabili o le costanti.

I rilevatori basati su albero di sintassi astratta (AST) lo fanno per le modifiche che coinvolgono blocchi più grandi, come espressioni, dichiarazioni, inserzioni, eliminazioni, ecc. Questi ultimi tendono a dare risposte migliori, perché a differenza dei rilevatori di token, possono utilizzare la struttura linguistica del codice sorgente del computer come guida.

Il nostro strumento CloneDR è un tale rivelatore.

Non conosco strumenti che troveranno effettivamente un codice "equivalente" (condizionali invertiti), ecc. I ricercatori hanno costruito rivelatori di cloni che fanno qualcosa del genere, ma la combinatoria rende l'esecuzione molto costosa e i prototipi di ricerca si ridimensionano male.

1
Ira Baxter