Czy istnieją narzędzia do określania podobieństwa kodu? [Zamknięte]

37

Nie mówię o narzędziu różnicowym. Naprawdę chcę sprawdzić, czy projekt zawiera kod, który mógł zostać „zrefaktoryzowany” z innego projektu. Prawdopodobnie nazwy funkcji, nazwy zmiennych i to, co nie, zostanie zmienione. Warunki warunkowe mogą być odwrócone itp.

Tamara Wijsman
źródło
5
Czy to dla klasy czy coś takiego?
TheLQ
1
@TheLQ - Mogę wymyślić więcej niż jeden przypadek poza klasą, w której poszedłem polować, aby zobaczyć, gdzie „wycinanie i wklejanie jest ponownie używane, prawda?” brygada przeszła.
MIA
Nie zapomnij o Atomiq Steve'a Smitha .
Jim G.
Komentarze i komunikaty wyjściowe (takie jak błędy itp.) Często mogą lepiej kodować odcisk palca niż kod rzeczywisty.
Bork Blatt
Zawsze grozili nam tym na Uni, ciekawie byłoby zobaczyć, czy takie narzędzie rzeczywiście istnieje.
Jake

Odpowiedzi:

10

Kiedy uczyłem inżynierii oprogramowania, korzystałem z (bezpłatnej) usługi w Stanford pod nazwą MOSS (Measure of Software Identity). Umożliwiło mi to bardzo łatwe wykrycie plagiatu między projektami studenckimi. System pozwolił mi również wpisać „znane dobre” przykłady kodu, których użyłem podczas zajęć, które miały zostać zignorowane.

Wspaniałą rzeczą (całkowicie kwestią poboczną) w wynikach, które powróciły, było to, że mogliśmy powiedzieć, którzy uczniowie pracowali razem - nawet jeśli nie rażąco kopiowali kod, dyskutowali o problemach wystarczająco, aby ich kod był podobny. Smutną częścią było znalezienie dziwnego studenta BEZ PODOBNOŚCI do jakiegokolwiek innego kodu. Zwykle nie radzili sobie tak dobrze.

Peter K.
źródło
Dzięki, szukałem czegoś dokładnie takiego :)
Ulrich Dangel
8

Być może będziesz w stanie użyć narzędzia PMD, aby znaleźć to, czego szukasz. Ma na celu wykrywanie wycinania i wklejania w bazie kodu, ale jeśli podasz źródło projektu o podejrzewanym pochodzeniu, może pomóc ci zobaczyć, gdzie kod został skopiowany.

busyspin
źródło
tak - używamy CPD z PMD w naszym kodzie
JoseK
Ale PMD jest tylko dla Javy, prawda?
Janusz Lenar,
5

Najbliższa rzecz, jaką wiem o tym, czego szukasz, to detektyw klonów. Jest to wtyczka Visual Studio.

Clone Detective to integracja programu Visual Studio, która pozwala analizować projekty w języku C # pod kątem kodu źródłowego, który jest zduplikowany w innym miejscu. Posiadanie duplikatów może łatwo prowadzić do niespójności i często jest wskaźnikiem źle rozłożonego kodu.

epotter
źródło
4

Wygląda na to, że chcesz obliczyć różnicę między dwoma abstrakcyjnymi drzewami składni (AST), więc możesz zainteresować się narzędziem Smart Differencer .

Znaleziony na https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff .

Matthew Rodatus
źródło
(Dzięki za komplement dla mojego narzędzia). SmartDifferencer znajduje różnice między określoną parą plików; podobieństwo jest uzupełnieniem różnic, więc zgadzam się, że jest to właściwy pomysł, ale wymaga to zidentyfikowania pary plików, aby je podać, a to jest bolesne, jeśli twój system składa się z wielu plików. To, co naprawdę jest potrzebne, to uzupełnienie: znajdź podobieństwo i zrób to bez osobistej identyfikacji par plików. Zobacz moją odpowiedź CloneDR w tym samym wątku dla takiego narzędzia. Tak, wykorzystuje powiązaną technologię.
Ira Baxter,
1

Nawet jeśli nie mówisz o narzędziu różnicowym, nadal możesz go użyć, przynajmniej do pewnego stopnia. Jeśli na przykład widzę dwie sekcje kodu, które wyglądają podobnie, często wklejam obie do BeyondCompare, aby zobaczyć, ile pracy wymagałoby uproszczenie go przez zreformowanie wspólnej funkcjonalności.

Z drugiej strony, jeśli nie wiesz, gdzie jest podobny kod, ale zastanawiasz się, czy gdzieś istnieje ... czego szukasz? Zautomatyzowane narzędzie do wykrywania plagiatu? Nie jestem pewien, czy coś takiego istnieje.

Mason Wheeler
źródło
Gdyby tak było, SCO mógłby wygrać z IBM :-)
1

Ten artykuł na wikipedii na ten temat zawiera również linki do kilku narzędzi, które można wykorzystać do znalezienia podobnego lub zduplikowanego kodu. Mamy do tego wewnętrzne narzędzie, więc nie znam narzędzi zewnętrznych wymienionych w artykule.

Alan
źródło
1

To, co naprawdę chcesz zrobić, to sprawdzić, czy kod jest sklonowany (skopiowany) w dwóch projektach (oba projekty składają się z możliwie dużych zestawów plików). Możesz to zrobić, uruchamiając narzędzie do wykrywania klonów. Wikipedia wymienia wiele z nich.

Aby zdecydować rażąco, czy jest dużo kopiowania, wystarczy dopasować linie źródłowe i istnieje wiele dokładnych detektorów klonowania linii źródłowej. Uważam, że PMD jest jednym z nich. Nie zrobią tego, aby znaleźć kod, który jest edytowany i kopiowany i wklejany; odkryją, że niezmieniony kod kopiuj-wklej-niezmieniony prawdopodobnie jest zawinięty wokół edytowanych elementów.

Jeśli chcesz zobaczyć szczegóły kopiowania dla kodu kopiuj i edytuj, potrzebujesz detektora klonowania, który znajdzie klony „sparametryzowane”. Detektory oparte na tokenach robią to dla edycji, które zastępują tylko nazwy zmiennych lub stałe.

Detektory oparte na drzewie składni abstrakcyjnej (AST) robią to w przypadku edycji z udziałem większych fragmentów, takich jak wyrażenia, instrukcje, wstawki, usunięcia itp. Te ostatnie dają lepsze odpowiedzi, ponieważ w przeciwieństwie do detektorów tokenów, mogą wykorzystać jako strukturę strukturę języka kodu źródłowego komputera.

Nasze narzędzie CloneDR jest takim wykrywaczem.

Nie znam narzędzi, które faktycznie znajdą „równoważny” kod (odwrócone warunkowe) itp. Naukowcy zbudowali detektory klonów, które robią coś takiego, ale kombinatoryka sprawia, że ​​wykonanie tego jest bardzo kosztowne, a prototypy badawcze źle skalowane.

Ira Baxter
źródło
1

Bardzo podoba mi się, jak CCFinderX wizualizuje podobieństwo, więc możesz chcieć to sprawdzić. Obsługuje wiele języków, jest darmowy i dość łatwy w konfiguracji (Python 2.6).

Zniszczyć
źródło