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.
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
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
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 🙂
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.
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.
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.
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