Ähnlicher Code-Detektor

Lesezeit: 4 Minuten

Benutzer-Avatar
Simon Toth

Ich suche nach einem Tool, das Quellcodes auf Ähnlichkeit vergleichen kann.

Wir haben im Moment ein sehr triviales System, das eine riesige Menge falsch positiver Ergebnisse enthält, und die wirklich positiven Ergebnisse können leicht darin vergraben werden.

Meine Anforderungen sind:

  • relativ geringe Menge an Fehlalarmen
  • gute Erkennungsrate (ja, die gehen gegeneinander)
  • idealerweise mit einer komplexeren Ausgabe als nur einem einzelnen Wert
  • verwendbar für C (C99) und C++ (C++03 und optimalerweise C++11)
  • noch gepflegt
  • verwendbar, um zwei Quelldateien miteinander zu vergleichen
  • nutzbar im nicht-interaktiven Modus

BEARBEITEN:

Um Verwirrung zu vermeiden, sind die folgenden beiden Codeausschnitte identisch und sollten als solche erkannt werden:

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

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

Dasselbe hier:

int x = 10; y = x + 5;

int a = 10; y = a + 5;

  • Befriedigt diff einige Ihrer Bedürfnisse?

    – Höchstleistungszeichen

    6. Juni 2012 um 10:28 Uhr

  • @HighPerformanceMark LOL, nein tut es nicht.

    – Simon Toth

    6. Juni 2012 um 10:29 Uhr

  • Es sieht so aus, als ob Sie ein Tool wollen, das die semantische Ähnlichkeit von 2 Codes vergleicht, anstatt die Syntax. Ich vermute, dass dies ein ungelöstes Problem ist und dass SO Schwierigkeiten haben wird, eine zufriedenstellende Lösung für Sie zu finden. Ich denke, dass Ihre ursprüngliche Frage, so wie sie geschrieben wurde, viele Leser genauso in die Irre führen wird, wie sie mich in die Irre geführt hat. Ich denke auch, dass Sie es komplett neu schreiben sollten, um klar anzugeben, an welcher Art von Vergleich Sie interessiert sind.

    – Höchstleistungszeichen

    6. Juni 2012 um 10:36 Uhr


  • Was ist mit Moos? theorie.stanford.edu/~aiken/moss

    – Mike Kwan

    6. Juni 2012 um 10:39 Uhr


Ich habe MOSS in der Vergangenheit verwendet: http://theory.stanford.edu/~aiken/moss/ plagiierten Code zu erkennen. Da es auf semantischer Ebene arbeitet, erkennt es die Situationen, die Sie oben dargestellt haben. Das Tool ist sprachbewusst, sodass Kommentare bei der Analyse nicht berücksichtigt werden, und es trägt wesentlich dazu bei, Code zu erkennen, der durch einfaches Suchen und Ersetzen von Variablen- und/oder Funktionsnamen geändert wurde.

Hinweis: Ich habe das Tool vor ein paar Jahren verwendet, als ich Informatik an der Graduiertenschule unterrichtete, und es funktionierte wunderbar bei der Erkennung von Code, der aus dem Internet gezogen wurde. Hier ist ein gut dokumentierter Bericht über eine ähnliche Anwendung: http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

Wenn Sie „Software-Ähnlichkeit messen“ googeln, sollten Sie einige weitere nützliche Treffer finden:
http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html

  • Anscheinend ist der Link zu fie1012.org nicht mehr gültig. Könnten Sie einen alternativen Link bereitstellen?

    – Eric Tobias

    31. Dezember 2015 um 13:19 Uhr

Benutzer-Avatar
Javar

Ihr Problem in der Informatik-Terminologie könnte als Quellcode-Plagiatserkennung bezeichnet werden. Ein guter Anfang wäre, diesen Artikel über Dr. Dobbs zu lesen: Erkennen von Quellcode-Plagiaten. Es listet die Algorithmen zur Erkennung von Plagiaten im Quellcode auf.

Hinweis: Was Sie gefragt haben, ist in der Tat ein schwieriges Computerproblem 🙂

Kann Copy-Paste-Detektor aus sein PMD?

Ich fange an, JPLAG zu verwenden (https://github.com/jplag/jplag), um die Codeähnlichkeit zu überprüfen und die Arbeiten der Schüler in Java- und Textdateien zu vergleichen. Es funktioniert gut, um die gleiche Codestruktur und Variablensubstitution zu überprüfen.

Du könntest es versuchen duplo. Es wird gemeinsame Linien finden. Es hat eine gewisse Fähigkeit, Whitespace-Änderungen zu ignorieren, erkennt jedoch keinen Code mit umbenannten Variablen, sodass es eher eine Aufräumhilfe als eine Hilfe beim Erkennen von Plagiaten ist.

(Antwort kommt spät, aber die Relevanz der Frage verschwindet nie)

Ich stand vor einem ähnlichen Problem und schrieb eine webbasierte Anwendung.

https://jefferey-cave.gitlab.io/miss/

Ich habe in Javascript und Python unterrichtet, das sind also die Sprachen, die es behandelt. Es kann (derzeit) nicht mit C/C++ umgehen. Ich wäre gespannt, wie der Javascript-Interpreter mit C umgeht.

verfügbar auf gitlab


Das Problem, mit dem ich konfrontiert war, war, dass es illegal war, Studentencodes über internationale Grenzen hinweg einzureichen (MOSS war verboten), also brauchte ich etwas, das lokal laufen würde. Die Implementierung ist ein reiner clientseitiger Browser.

Interessanterweise denke ich, dass es Ihre Kriterien für “niedrige Fehlalarme” auf einzigartige Weise erfüllen kann. Es gibt immer etwas Ähnlichkeit zwischen den Aufgaben, verwendet jedoch eine einzigartige Technik, um den Punkt zu identifizieren, an dem Dinge “verdächtig aussehen”.

Ich fand es nützlicher, um die Gruppendynamik im Klassenzimmer zu bestimmen (wer arbeitet/lernt mit wem).

Es hat einige lustige Live-Grafiken, daher war es nützlich, es einer Undergrad-Klasse zu zeigen, nachdem sie ihre erste Aufgabe eingereicht hatten. Bei der ersten Aufgabe war immer ein hohes Maß an Ähnlichkeit vorhanden, daher kann es nicht schaden, dies live zu demonstrieren (mit anonymisierten Einreichungsnamen).

Ich erzähle immer die Geschichte des Schülers, von dem ich dachte, dass er (grob und offensichtlich) betrügt. Ihre Arbeit zeigte eine bemerkenswerte Ähnlichkeit mit der sehr einzigartigen Antwort eines anderen Studenten. Der Vergleich der Arbeit des Schülers mit dem Rest der Klasse zeigte keine nennenswerte Ähnlichkeit relativ zum Rest der Klasse. Es war deutlich unter der Schwelle von “interessant”. Dies führte zu einer eingehenderen Untersuchung der Einreichung … es stellte sich heraus, dass es ein Tutorial gegeben hatte, und der Stil zeigte sich, aber die Arbeit war einzigartig.

Nichts geschah, und diese Schüler fanden nie heraus, wie nahe sie gekommen waren.

1171120cookie-checkÄhnlicher Code-Detektor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy