Gibt es Tools zur Bestimmung der Code-Ähnlichkeit? [geschlossen]


37

Ich spreche nicht von einem Diff-Tool. Ich bin wirklich gespannt, ob ein Projekt Code enthält, der möglicherweise von einem anderen Projekt "überarbeitet" wurde. Es ist wahrscheinlich, dass Funktionsnamen, Variablennamen und so weiter geändert werden. Bedingungen können umgekehrt werden usw.


5
Ist das für eine Klasse oder so?
TheLQ

1
@TheLQ - Ich kann mir mehr als einen Fall außerhalb eines Klassenzimmers vorstellen, in dem ich auf die Jagd gegangen bin, um zu sehen, wo das Ausschneiden und Einfügen wiederverwendet wird, oder? Brigade hat durchgemacht.
MIA,

Vergiss nicht Steve Smiths Atomiq .
Jim G.

Kommentare und Ausgabenachrichten (wie Fehler usw.) können häufig den Fingerabdruckcode besser als den tatsächlichen Code anzeigen.
Bork Blatt

Sie haben uns an der Uni immer damit gedroht, es wäre interessant zu sehen, ob es ein solches Tool überhaupt gibt.
Jake

Antworten:


10

Als ich Software Engineering unterrichtete, nutzte ich den (kostenlosen) Dienst MOSS (Measure of Software Similarity) von Stanford. Dadurch konnte ich sehr leicht Plagiate zwischen Studentenprojekten erkennen. Das System erlaubte mir auch, "bekannt gute" Codebeispiele einzugeben, die ich während des Unterrichts verwendet hatte und die ignoriert werden sollten.

Das Tolle an den Ergebnissen war, dass wir feststellen konnten, welche Schüler zusammengearbeitet hatten - auch wenn sie den Code nicht offen kopierten, diskutierten sie die Probleme so oft, dass ihr Code ähnlich war. Das Traurige war, den einen oder anderen Schüler zu finden, der mit keinem anderen Code vergleichbar war. Sie machten es normalerweise nicht so gut.


Danke, ich habe genau das gesucht :)
Ulrich Dangel

8

Möglicherweise können Sie das PMD-Tool verwenden , um das Gesuchte zu finden. Es ist dazu gedacht, das Ausschneiden und Einfügen in einer Codebasis zu erkennen. Wenn Sie jedoch die Quelle des vermuteten Ursprungsprojekts angeben, können Sie möglicherweise sehen, wo Code daraus kopiert wurde.


yep - wir verwenden die CPD von PMD in unserem Code
JoseK

Aber PMD ist nur für Java, oder?
Janusz Lenar

5

Das nächste, was ich von dem, was Sie suchen, weiß, ist Clone Detective. Es ist ein Visual Studio-Plug-In.

Clone Detective ist eine Visual Studio-Integration, mit der Sie C # -Projekte auf Quellcode analysieren können, der an einer anderen Stelle dupliziert wurde. Das Vorhandensein von Duplikaten kann leicht zu Inkonsistenzen führen und ist oft ein Indikator für schlecht faktorisierten Code.


4

Es hört sich so an, als ob Sie den Unterschied zwischen zwei abstrakten Syntaxbäumen (AST) berechnen möchten, sodass Sie möglicherweise an dem Smart Differencer-Tool interessiert sind .

Gefunden unter https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff .


(Danke für das Kompliment an mein Tool). SmartDifferencer erkennt Unterschiede zwischen einem bestimmten Dateipaar. Ähnlichkeit ist die Ergänzung der Unterschiede, daher stimme ich zu, dass dies die richtige Idee ist. Sie müssen jedoch ein Dateipaar identifizieren, um sie zu erhalten, und das ist schmerzhaft, wenn Ihr System aus vielen Dateien besteht. Was wirklich benötigt wird, ist diese Ergänzung: Finden Sie die Ähnlichkeit und tun Sie dies, ohne Dateipaare persönlich zu identifizieren. Siehe meine CloneDR-Antwort in diesem Thread für ein solches Tool. Ja, es wird verwandte Technologie verwendet.
Ira Baxter

1

Auch wenn es sich nicht um ein Diff-Tool handelt, können Sie es zumindest in gewissem Umfang verwenden. Wenn ich zum Beispiel zwei Codeabschnitte sehe, die ähnlich aussehen, füge ich häufig beide in BeyondCompare ein, um zu sehen, wie viel Arbeit es bedeuten würde, sie zu vereinfachen, indem die allgemeine Funktionalität überarbeitet wird.

Auf der anderen Seite, wenn Sie nicht wissen, wo sich der ähnliche Code befindet, sich aber fragen, ob es irgendwo einen gibt ... wonach suchen Sie? Ein automatisiertes Tool zur Erkennung von Plagiaten? Ich bin mir nicht sicher, ob es so etwas gibt.


Wenn

1

Dieser Artikel auf Wikipedia zu diesem Thema enthält auch Links zu verschiedenen Tools, mit denen Sie ähnlichen oder doppelten Code finden können. Wir haben ein internes Tool dafür, so dass ich mit den im Artikel erwähnten externen Tools nicht vertraut bin.


1

Was Sie wirklich tun möchten, ist zu sehen, ob Code zwischen den beiden Projekten geklont (kopiert) wurde (beide Projekte bestehen aus möglicherweise großen Dateigruppen). Sie können dies tun, indem Sie ein Tool zur Klonerkennung ausführen. Wikipedia listet eine Vielzahl von ihnen auf.

Um grob zu entscheiden, ob viel kopiert wird, müssen Sie nur die Quelllinien abgleichen, und es gibt eine Vielzahl von exakten Quelllinien-Klon-Detektoren. Ich glaube, PMD ist einer von ihnen. Was diese nicht tun, ist, Code zu finden, der durch Kopieren und Einfügen bearbeitet wurde. Sie werden feststellen, dass der Code, der durch Kopieren und Einfügen unverändert bleibt, wahrscheinlich um das kopierte, überarbeitete Material gewickelt ist.

Wenn Sie die Details des Kopierens für Copy-Past-Edit-Code anzeigen möchten, benötigen Sie einen Klondetektor, der "parametrisierte" Klone findet. Token-basierte Detektoren tun dies für Bearbeitungen, die nur Variablennamen oder Konstanten ersetzen.

Auf Abstract-Syntax Tree (AST) basierende Detektoren führen dies für Bearbeitungen durch, die größere Teile wie Ausdrücke, Anweisungen, Einfügungen, Löschungen usw. umfassen. Letztere geben tendenziell bessere Antworten, da sie im Gegensatz zu den Tokendetektoren die Sprachstruktur des Computer-Quellcodes als Leitfaden verwenden können.

Unser CloneDR- Tool ist ein solcher Detektor.

Ich kenne keine Tools, die tatsächlich "äquivalenten" Code finden (umgekehrte Bedingungen) usw. Forscher haben Klondetektoren gebaut, die so etwas tun, aber die Kombinatorik macht die Ausführung sehr teuer, und die Forschungsprototypen sind schlecht skaliert.


1

Mir gefällt sehr, wie CCFinderX Ähnlichkeiten visualisiert. Vielleicht möchten Sie auch diese überprüfen. Unterstützt eine ganze Reihe von Sprachen, ist kostenlos und ziemlich einfach einzurichten (Python 2.6).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.