it-swarm.dev

Gibt es Tools zur Bestimmung der Codeähnlichkeit?

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 sein usw.

37
siljoy

Als ich Software-Engineering unterrichtete, nutzte ich den (kostenlosen) Service bei Stanford nannte MOSS (Maß für Software-Ähnlichkeit). Dadurch konnte ich 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 (ein Nebenproblem) an den Ergebnissen war, dass wir feststellen konnten, welche Schüler zusammengearbeitet haben - auch wenn sie den Code nicht offen kopiert haben, haben sie die Probleme so weit diskutiert, dass ihr Code ähnlich war. Der traurige Teil war, den einen oder anderen Schüler ohne Ähnlichkeit mit einem anderen Code zu finden. Normalerweise machten sie es nicht so gut.

10
Peter K.

Möglicherweise können Sie das PMD-Tool verwenden, um zu finden, wonach Sie suchen. Es soll das Ausschneiden und Einfügen innerhalb einer Codebasis erkennen. Wenn Sie jedoch die vermutete Origin-Projektquelle angeben, können Sie möglicherweise besser erkennen, wo Code daraus kopiert wurde.

8
busyspin

Das nächste, von dem ich weiß, wonach Sie suchen, 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. Duplikate können leicht zu Inkonsistenzen führen und sind häufig ein Indikator für schlecht berücksichtigten Code.

5
epotter

Es hört sich so an, als ob Sie den Unterschied zwischen zwei abstrakten Syntaxbäumen (AST) berechnen möchten. Daher könnte Sie das Smart Differencer Tool interessieren.

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

4
Matthew Rodatus

Auch wenn Sie nicht über ein Diff-Tool sprechen, können Sie zumindest bis zu einem gewissen Grad eines dafür verwenden. Wenn ich beispielsweise 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 allgemeinen Funktionen überarbeitet werden.

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

1
Mason Wheeler

Dieser Artikel auf Wikipedia zu diesem Thema enthält auch Links zu verschiedenen Tools, mit denen ähnlicher oder doppelter Code gefunden werden kann. Wir haben ein internes Tool dafür, daher bin ich mit den im Artikel erwähnten externen Tools nicht vertraut.

1
Alan

Ich mag es wirklich, wie CCFinderX Ähnlichkeit visualisiert, also möchten Sie vielleicht auch diese überprüfen. Unterstützt einige Sprachen, ist kostenlos und ziemlich einfach einzurichten (Python 2.6).

1
MaR

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

Um grob zu entscheiden, ob viel kopiert wird, müssen Sie nur die Quellzeilen abgleichen, und es gibt eine Vielzahl von exakten Klondetektoren für Quelllinien. Ich glaube, PMD ist einer von ihnen. Was diese nicht tun, ist Code zu finden, der kopiert, eingefügt und bearbeitet wird. Sie werden feststellen, dass der Code für das Kopieren, Einfügen und unveränderte Boilerplate wahrscheinlich um das von der Kopie bearbeitete Material gewickelt ist.

Wenn Sie die Details des Kopierens für Code zum Kopieren und Bearbeiten anzeigen möchten, benötigen Sie einen Klondetektor, der "parametrisierte" Klone findet. Token-basierte Detektoren tun dies für Änderungen, die nur Variablennamen oder Konstanten ersetzen.

AST-basierte Detektoren (Abstract-Syntax Tree) tun dies für Bearbeitungen, an denen größere Blöcke beteiligt sind, z. B. Ausdrücke, Anweisungen, Einfügungen, Löschungen usw. Letztere geben tendenziell bessere Antworten, da sie im Gegensatz zu den Token-Detektoren 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
Ira Baxter