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

35

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 nomi di funzioni, nomi di variabili e quant'altro verrebbero modificati. Le condizioni potrebbero essere invertite, ecc.

    
posta Tom Wijsman 21.09.2010 - 02:35
fonte

8 risposte

9

Quando insegnavo ingegneria del software, ho utilizzato il servizio (gratuito) all'indirizzo Stanford chiamato MOSS (Misura della similarità del software). Questo mi ha permesso di individuare il plagio tra i progetti degli studenti molto facilmente. Il sistema mi ha anche permesso di inserire esempi di codice "noto" che avevo usato durante la lezione che dovevano essere ignorati.

La cosa grandiosa (completamente un problema secondario) sui risultati che sono tornati sono stati che potremmo dire quali studenti hanno lavorato insieme --- anche se non hanno copiato clamorosamente il codice, hanno discusso i problemi abbastanza che il loro codice era simile. La parte triste è stata trovare lo studente strano con NESSUNA SIMILITÀ rispetto a qualsiasi altro codice. Di solito non andavano molto bene.

    
risposta data 18.06.2011 - 19:36
fonte
8

Potresti essere in grado di utilizzare lo strumento PMD per trovare quello che stai cercando. È pensato per 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.

    
risposta data 21.09.2010 - 03:34
fonte
5

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

Clone Detective is a Visual Studio integration that allows you to analyze C# projects for source code that is duplicated somewhere else. Having duplicates can easily lead to inconsistencies and often is an indicator for poorly factored code.

    
risposta data 21.09.2010 - 03:59
fonte
4

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

Trovato su link .

    
risposta data 19.05.2011 - 14:15
fonte
1

Anche se non stai parlando di uno strumento diff, puoi ancora usarne uno per questo, almeno in una certa misura. Se vedo due sezioni di codice che sembrano simili, ad esempio, inserisco spesso in BeyondCompare per vedere quanto lavoro sarebbe utile per semplificare la refactoring della funzionalità comune.

D'altra parte, se non sai dove si trova il codice simile, ma ti stai 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.

    
risposta data 21.09.2010 - 02:39
fonte
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.

    
risposta data 21.09.2010 - 03:42
fonte
1

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

Per decidere in modo grossolano se c'è molta copia, devi solo abbinare le linee di origine, e ci sono una varietà di rivelatori di cloni della linea di origine esatti. Credo che PMD sia uno di questi. Ciò che questi non fanno è trovare il codice che è copiato e incollato; troveranno il codice di copia-incolla-lastra che può essere spostato attorno alla roba copiata.

Se vuoi vedere i dettagli della copia per il codice copy-past-edit, hai bisogno di un rilevatore di cloni che trovi cloni "parametrizzati". I rilevatori basati su token lo fanno per modifiche che sostituiscono solo nomi o costanti di variabili.

I rivelatori basati su ASTA (Abstract-syntax tree) fanno questo per modifiche che coinvolgono blocchi più grandi, come espressioni, istruzioni, inserzioni, cancellazioni, et. Questi ultimi tendono a dare risposte migliori, perché diversamente dai rivelatori di token, possono usare come guida la struttura linguistica del codice sorgente del computer.

Il nostro strumento CloneDR è un rilevatore di questo tipo.

Non conosco strumenti che in realtà troveranno codice "equivalente" (condizionali invertiti), ecc. I ricercatori hanno costruito rilevatori di cloni che fanno qualcosa del genere, ma i combinatorici rendono questo molto costoso da eseguire, e i prototipi di ricerca ridimensionato male.

    
risposta data 18.06.2011 - 19:20
fonte
1

Mi piace molto il modo in cui CCFinderX visualizza la somiglianza, quindi potresti voler controllare anche quello. Supporta un bel po 'di lingue, è gratuito e abbastanza facile da configurare (Python 2.6).

    
risposta data 20.06.2011 - 11:36
fonte

Leggi altre domande sui tag