Plagiat kodu na podstawie wielu wersji

0

Witam

Piszę aktualnie aplikację, której zadaniem ma być porównywanie kodów źródłowych z kodami źródłowymi zgromadzonymi w repozytorium, do którego dodany będzie każdy następny sprawdzany kod, w celu wykrycia plagiatu czyli po prostu kodu w całości lub części wziętego od kogoś, ewentualnie minimalnie zmodyfikowanego poprzez zmianę nazw zmiennych czy przestawienie struktur w programie.
Jakie polecacie metody wykrycia takiego działania ??

Z góry dzięki za pomoc

0

To nie jest takie hop siup. Mozesz sparsowac kod tak by uzyskac drzewo operacji lub synonimy operacji i porownywac bloki operacji - to wyeliminuje nazwy zmiennych/funkcji/klas z rownania. Co do przestawienia struktur (np. deklaracji zmiennych jak rozumiem) to mozesz tworzyc tablice deklarowanych typow zmiennych/funkcji i porownywac w jakiej czesci sa wspolne.

0

Że to nie jest takie hop siup to ja już wiem ... mam kilka pomysłów, ale opierają się one głównie na statystyce analizowanego kodu, dlatego też poszukuję nowych rozwiązań

0

OT

Jest 10 rodzajów ludzi.
, czy może
Są 10 rodzaje ludzi.
?

0

W odpowiedzi na maila:

Przykladowo przerabiasz taki kod:

int a;
int b;

class abc{};

void fun(){ return 0;}

int main()
{
  a abc();
  abc* b = new abc();
}

na taki kod:

{deklaracja_zmiennej} int;
{deklaracja_zmiennej} int;

{deklaracja_klasy} klasa1
{definicja_funkcji} void argumenty(void)
{
  return 0;
}

{definicja_funkcji}
{
  {definicja_zmiennej typ klasa_1}
  {definicja_wskaznika typ klasa_1}
}

W ten sposob wszelkie nazwy przestaja miec znaczenie. Z klasami jest wiekszy problem, ale mozesz sobie zapisywac typy tych klas poprzez oznaczenie jakie skladowe posiadaja, np.

class a
{
  int a;
  char* b;
}
{deklaracja_klasy} klasa_1 skladowe int, char*

gdzie skladowe, to jakas lista typow skladowych klasy. Poprzez porownanie listy mozemy stwierdzic, czy klasa jest podobna do innej czy nie.

Fajnie byloby wykrywac operacje charakterystyczne, np. pomijac wszystkie deklaracje i definicje, pozostawic tylko dzialania (operatory i typy elementow, na jakich dzialaja, wywolania funkcji). To opieraloby sie na tym, ze program to uporzadkowana lista polecen - jezeli w liscie wazne elementy sa podobne to i algorytm jest podobny, a tym samym duza szansa, ze program rowniez.

Tak ja bym to widzial.

0

podobny mechanizm mam zaimplementowany, tzn zliczam metody oraz typy i ilość parametrów wejściowych i wyjściowych, Cały czas zastanawiam się nad zliczaniem zmiennych i ich typów, jako że analizować będę kody w javie a świat nie kończy się na int i string i muszę napisać na tyle skuteczny mechanizm by dobrze zinterpretował zmienną każdego typu i wpisał potem do tabeli ilości poszczególnych zmiennych poszczególnych typów, propozycja listy poleceń również jest ciekawa

0

Jeśli chodzi o programy javy, to proponuje najpierw kompilować a potem dekompilować (wszystkie tym samym dekompilatorem). Wiele pozornych różnic (kolejność składowych klasy, nazwy zmiennych lokalnych, nazwy parametrów) zniknie.
pozdrawiam

0

i tak to nie pomoze na 'plagiat' stworzony poprzez wziecie znanego programu X, opakowaniu losowych blokow kodu w wywolywane-tylko-raz-funkcje, albo tez powstrzykiwaie wieeeluuu bezsensownych nic nie wnoszacych linii :)) komp+dekomp jest niezlym pomyslem ale jedynie na parsowanie wstepne

0

z tą kompilacją i dekompilacją to ciekawa propozycja ... czekam na dalsze

0

Najpierw by trzeba było określić co to jest plagiat kodu. Czy np. użycie algorytmu, który jest ogólnie dostępny np. NWD jest plagiatem czy nie? No raczej nie. Dalej - w jakim momencie kod, który pierwotnie został skopiowany przestaje być plagiatem. Np. kolega daje Ci swój kod, Ty go przerabiasz, aż w końcu otrzymujesz zupełnie nowy kod, który plagiatem nie jest. Kiedy ten moment następuje.

Czyli warto by było zacząć pewnie od definicji plagiatu i założeń jakie musi spełniać kod aby był plagiatem. A następnie zebrać jakąś bazę plagiatów, albo samemu przygotować zestawy testowe i sprawdzać czy algorytm sprawdzający jest już wystarczająco dobry. Ja bym postawił na prostą weryfikację. Nie oszukujmy się, jeżeli ktoś popełnia plagiat to na 99% nie zmienia kodu. Czyli zwykłe kopiuj-wklej. Oprócz tego zmiana nazw zmiennych - nikomu nie chce się tego robić. Już na etapie porównywania nazw zmiennych pewnie wykryłoby się sporą część takich działań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1