2012-06-06 12 views
14

Poszukuję narzędzia, które może porównywać kody źródłowe podobieństwa.Podobny wykrywacz kodu

Mamy teraz bardzo trywialny system, który ma ogromną liczbę fałszywych alarmów, a prawdziwe pozytywy mogą z łatwością zostać w nich pochowane.

Moje wymagania to:

  • rozsądnie mała ilość fałszywych alarmów
  • dobry wskaźnik wykrywalności (yeah te idą przed siebie)
  • idealnie z bardziej złożonego wyjścia niż tylko jednej wartości
  • nadające się do C (C99) i C++ (C++ 03 ++ C, a optymalnie 11)
  • nadal utrzymywany
  • nadające się do współpracy mparing dwa pliki źródłowe z siebie
  • użytkowej w trybie non-interactive

EDIT:

Aby uniknąć nieporozumień, dwa następujące fragmenty kodu są identyczne i powinny być wykrywane jako takie:

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

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

To samo tutaj:

int x = 10; y = x + 5;

int a = 10; y = a + 5;

+1

Czy dyferencjał spełnia niektóre z Twoich potrzeb? –

+1

@HighPerformanceMark LOL, nie, nie. –

+2

Wygląda na to, że potrzebujesz narzędzia, które porównuje semantyczne podobieństwo dwóch kodów, a nie syntaktycznego. Podejrzewam, że jest to nierozwiązany problem i że SO będzie walczyć o znalezienie satysfakcjonującego rozwiązania dla ciebie. Myślę, że tak jak napisano, twoje pierwotne pytanie wprowadzi w błąd wielu czytelników, tak jak mnie wprowadziło w błąd. Sądzę, że powinieneś przepisać to całkowicie, aby jasno określić, jakiego rodzaju porównanie cię interesuje. –

Odpowiedz

15

Użyłem mchu w przeszłości: http://theory.stanford.edu/~aiken/moss/ wykryć kod plagiatem. Ponieważ działa na poziomie semantycznym, wykryje sytuacje przedstawione powyżej. Narzędzie jest językowe, więc komentarze nie są uwzględniane w analizie, a wykracza on daleko w wykrywaniu kodu, który został zmodyfikowany poprzez proste wyszukiwanie i zastępowanie nazw zmiennych i/lub funkcji.

Uwaga: Używałem tego narzędzia kilka lat temu, kiedy uczyłem informatyki w szkole gradowej i zadziałało doskonale w wykryciu kodu, który został wyrzucony z Internetu. Tu jest dobrze udokumentowana konto podobnego wniosku: http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

Jeśli google „podobieństwo oprogramowania miarę”, należy znaleźć kilka bardziej użytecznych przeboje: http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

+0

Wygląda na to, że link do fie1012.org jest już nieaktualny. Czy możesz podać alternatywny link? – Eric

+1

Wypróbuj ten: http://www3.nd.edu/~kwb/nsf-ufe/1110.pdf – Throwback1986

6

Twój problem z informatyką Terminologia może być określona jako wykrywanie plagiatu kodu źródłowego. Dobrym początkiem byłoby przeczytanie tego artykułu o Dr Dobbs: Detecting Source-Code Plagiarism. Zawiera listę algorytmów do wykrywania plagiatu w kodzie źródłowym.

Uwaga: Co ty prosić o to rzeczywiście trudny problem computing :)

1

można spróbować duplo. Znajdzie to wspólne linie. Ma pewną umiejętność ignorowania zmian białych znaków, ale nie wykrywa kodu ze zmienionymi zmiennymi, więc jest to bardziej pomoc w oczyszczaniu niż pomoc w wykryciu plagiatu.

1

Zaczynam używać JPLAG (https://github.com/jplag/jplag), aby sprawdzić podobieństwo kodu i porównać prace uczniów w Javie i plikach tekstowych. Dobrze sprawdza się ta sama struktura kodu i zmienna Zastępowanie.