Esistono strumenti per determinare la somiglianza del codice? [chiuso]


37

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.


5
È per una lezione o qualcosa del genere?
TheLQ

1
@TheLQ - Mi viene in mente più di un caso al di fuori di un ambiente di classe in cui sono andato a caccia per vedere dove il "taglia e incolla viene riutilizzato, giusto?" la brigata è passata.
MIA,

Non dimenticare l' Atomiq di Steve Smith .
Jim G.

Commenti e messaggi di output (come errori, ecc.) Possono spesso imprimere il codice dell'impronta digitale meglio del codice reale.
Bork Blatt,

Ci hanno sempre minacciato di farlo in Uni, sarebbe interessante vedere se un tale strumento esistesse davvero.
Jake,

Risposte:


10

Quando insegnavo ingegneria del software, utilizzavo il servizio (gratuito) di Stanford chiamato MOSS (Measure of Software Similarity). Ciò mi ha permesso di rilevare molto facilmente il plagio tra i progetti degli studenti. Il sistema mi ha anche permesso di inserire esempi di codice "conosciuti" che avevo usato durante la lezione che dovevano essere ignorati.

La cosa grandiosa (completamente una questione secondaria) sui risultati che sono tornati è stata quella di poter 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.


Grazie, stavo cercando qualcosa del genere :)
Ulrich Dangel l'

8

Potresti essere in grado di utilizzare lo 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 l'origine del progetto di origine sospetta potrebbe aiutarti a vedere da dove è stato copiato il codice.


sì - usiamo il CPD da PMD nel nostro codice
JoseK,

Ma PMD è solo per Java, giusto?
Janusz Lenar,

5

La cosa più vicina che conosco a quello 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.


4

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

Disponibile su https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff .


(Grazie per il complimento al mio strumento). SmartDifferencer trova le differenze tra una specifica coppia di file; la somiglianza è il complemento delle differenze, quindi concordo sul fatto che sia una specie dell'idea giusta Ma richiede che tu identifichi una coppia di file per darlo, e questo è doloroso se i tuoi sistemi sono composti da molti file. Ciò che è veramente necessario è quel complemento: trova la somiglianza e fallo senza identificare personalmente le coppie di file. Vedi la mia risposta CloneDR in questa stessa discussione per un tale strumento. Sì, utilizza la tecnologia correlata.
Ira Baxter,

1

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.


In tal caso, SCO avrebbe potuto vincere contro IBM :-)

1

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

Quello che vuoi veramente fare è vedere se c'è un codice clonato (copiato) tra i due progetti (entrambi i progetti consistono in possibilmente grandi set di file). È possibile 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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.