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.
tools
comparison
Tamara Wijsman
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
Najbliższa rzecz, jaką wiem o tym, czego szukasz, to detektyw klonów. Jest to wtyczka Visual Studio.
źródło
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 .
źródło
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.
źródło
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.
źródło
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.
źródło
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).
źródło