[PYTHON] Soll ich diese Kopie reparieren?

Es ist nicht ungewöhnlich zu sagen, dass das Kopieren und Einfügen von Codeklonen des Quellcodes zuverlässiger ist, aber in vielen Fällen sind wir häufig in letzter Minute von Codeklonen betroffen.

Nachdem die verantwortliche Person weggelaufen war, den Quellcode bis spät in die Nacht korrigiert und veröffentlicht hatte, sagte er: "Ich mache es mit Kopieren und Einfügen, also bitte alles andere reparieren und testen." Ist sehr sehr traurig.

Es ist eine Demütigung, fast denselben Quellcode zu ändern, indem man ihn subtil ändert, als würde man nach einem Fehler suchen.

Um solche Bestrafungsspiele zu vermeiden, sollte in letzter Minute die Häufigkeit des Kopierens jederzeit überwacht und ungewöhnliche Häufigkeit sofort korrigiert werden.

In diesem Abschnitt werden die Tools zum Erkennen von Kopieren und Einfügen beschrieben.

PMD-CPD PMD ist ein Tool zum Erkennen potenzieller Probleme im in Java implementierten Java-Quellcode. http://pmd.sourceforge.net/snapshot/

Teil dieser Funktion ist der CPD-Befehl, der doppelten Code erkennt und doppelte Codes in den folgenden Programmiersprachen erkennen kann: ・ Java ・ JSP ・ C ++ ・ Ruby ・ Fortran ・ PHP ・ C # ・ PLSQL ・ Ecmascript

Wie installiert man

Laden Sie eine der folgenden Dateien herunter, entpacken Sie sie und extrahieren Sie sie in einen beliebigen Ordner. http://sourceforge.net/projects/pmd/files/pmd/

Ausführungsbeispiel

Ausführungsbeispiel unter Windows

cpd --minimum-tokens 50 --language ecmascript --format text --encoding utf8 --files C:\tool\clonedigger\test\ > result.txt

Ausführungsbeispiel unter Linux

bin/run.sh cpd --minimum-tokens 35 --format xml --language ruby --files /var/lib/redmine/app/ > result.xml

Parameter

Die Parameter werden von Windows und Linux gemeinsam genutzt.

Parameter Erläuterung
--minimum-tokens Geben Sie die Anzahl der Token an, um Duplikate zu erkennen.
--format text,xml,Sie können csv auswählen. Wenn Sie es in XML ausgeben, können Sie es in Jenkins verwenden.
--language Gibt den Typ der Programmiersprache an.
--files Geben Sie das Verzeichnis des zu überprüfenden Quellcodes an. Dies wird rekursiv erkannt.
--encoding Gibt die Codierung des zu prüfenden Quellcodes an

GUI Sie können auch mit der GUI arbeiten, indem Sie bin / cpdgui.bat ausführen. clone.png

Clonedigger Clonedigger ist ein in Python und Java implementiertes Tool zum Erkennen von Kopieren / Einfügen. http://clonedigger.sourceforge.net/

Die auffindbaren Programmiersprachen sind:

・ Python ・ Java ・ Lua ・ Javascript

Im Folgenden finden Sie einige Tipps zum Erkennen anderer Programmiersprachen als Python.

Wie installiert man

easy_install clonedigger

Ausführungsbeispiel

Beispiel für die Python-Erkennung

__ Wenn Sie eine Datei angeben __

clonedigger -l python -o ./test.html C:\tool\clonedigger\test\test_utf8.py

__Wenn Sie einen Ordner angeben __

clonedigger -l python -o ./test.html C:\tool\clonedigger\test\test_utf8.py

Wenn Sie einen Ordner angeben, werden auch Unterordner erkannt. Erstellt den folgenden HTML-Code in der durch -o angegebenen Datei.

clone.png

Wenn Sie die Option --cpd-output wie folgt verwenden, wird sie im XML-Format ausgegeben. Dieses Ausgabeformat entspricht PMD / CPD.

clonedigger -l python --cpd-output -o test.xml C:\tool\clonedigger\test\python\

Java-Erkennungsbeispiel

Wenn Sie anderen Quellcode als Python erkennen, funktioniert dies nur, wenn java_antlr im aktuellen Verzeichnis vorhanden ist. Für Windows und Python 2.7 sind die folgenden Vorgänge erforderlich.

cd C:\Python27\Lib\site-packages\clonedigger-1.1.0-py2.7.egg\clonedigger
clonedigger -l java --cpd-output -o test.xml C:\tool\clonedigger\test\test.java

Beispiel für die JavaScript-Erkennung

Wenn JavaScript erkannt wird, funktioniert es nur, wenn js_antlr im aktuellen Verzeichnis vorhanden ist. Für Windows und Python 2.7 sind die folgenden Vorgänge erforderlich.

cd C:\Python27\Lib\site-packages\clonedigger-1.1.0-py2.7.egg\clonedigger
clonedigger -l js --cpd-output -o test.xml C:\tool\clonedigger\test\test.js

JavaScript, das im Browser ausgeführt wird, funktioniert auch mit der folgenden schlampigen Implementierung.

  //Extra letztes Komma
  var questions = [
    {message: "ah ah", category: Category.emotionalExhaustion} ,
  ];

Wenn bei Clonedigger eine solche ungültige Beschreibung vorliegt, wird die Analyse unterbrochen und ein Fehler auftritt. Zu diesem Zeitpunkt wird die folgende Fehlermeldung angezeigt, die einen Hinweis zur Korrektur darstellt.

line 14:2 rule arrayItem failed predicate: { input.LA(1) == COMMA }?

AIST CCFinderX Sie können den in den Kommentaren gelehrten AIST CC Finder X von der folgenden Seite herunterladen. http://www.ccfinder.net/ccfinderxos-j.html

Es erfordert 32-Bit-Java und Python 2.6 (weder oben noch unten), um zu funktionieren. Wenn Sie die Windows-Binärdatei herunterladen, funktioniert sie nur, wenn Sie sie auf 32 Bit ausführen. Daher müssen Sie gemx.bat wie folgt ändern.

gemx.bat


set PATH=C:\Windows\SysWOW64;C:\TracLight\python;C:\TracLight\python\python\Scripts\;%~dp0\scripts
set CCFINDERX_PYTHON_INTERPRETER_PATH=C:\TracLight\python\python.exe

Das folgende Bild ist ein Beispiel für den Bildschirm, der von gem x.bat erkannt wurde. 無題.png

Darüber hinaus können Sie auch ein Streudiagramm anzeigen. Diese GUIs sind faszinierend.

Bei Ausführung über die Befehlszeile:

ccfx p java -d c:\dev\java\

Die a.ccfxd-Ausgabe zu diesem Zeitpunkt ist eine Binärdatei, die mit GemX geöffnet werden kann. Sie können es mit dem folgenden Befehl in das Textformat konvertieren.

>ccfx p a.ccfxd > test.txt

Visual Basic-Unterstützung

Visual Basic wird als solches Tool selten unterstützt. Es scheint, dass der mit VB6 und VBA erstellte Code ebenfalls analysiert wird. Die cls-Datei wird jedoch nicht erkannt. Ändern Sie daher ccfx_prep_scripts.ini wie folgt.

visualbasic=.vb;.bas;.frm;.cls

Andere

Überwachung durch Jenkins

Sie können Code-Klonübergänge mit dem Jenkins Violations-Plug-In überwachen. https://wiki.jenkins-ci.org/display/JENKINS/Violations

  1. Generieren Sie XML im Arbeitsbereich des Jenkins-Skripts.

  2. Geben Sie im Post-Build-Prozess der Projekteinstellungen das XML von 1. im cpd von Berichtsverletzungen an. clone.png

  3. Jeder Build erstellt einen Bericht wie den folgenden. clone.png

Recommended Posts

Soll ich diese Kopie reparieren?
Lassen Sie uns zusammenfassen, was Sie tun möchten.
Links, um mit Sublime Text zu tun, was Sie wollen
[AWS] Was tun, wenn Sie mit Lambda pfeifen möchten?
[AWS EC2] Einstellungen, die Sie unter Amazon Linux 2 vornehmen möchten
Ich möchte ○○ mit Pandas machen
Ich möchte Yolos Anmerkung kopieren
Möchten Sie mit Python Selenium auf allgemeine Zwecke warten?
Wollen Sie nicht sagen, dass Sie ein Gesichtserkennungsprogramm erstellt haben?
Zwei Tools zur Dokumentenerstellung, die Sie unbedingt verwenden möchten, wenn Sie Python schreiben
So schreiben Sie Umgebungsvariablen, die Sie nicht in [GitHub] Python einfügen möchten
Behandeln Sie CSV mit dem Element, das Sie im Namen der Datei analysieren möchten
[Linux] Sie haben keine Root-Rechte. Aber ich möchte yum installieren.
Linux: Netplan-Konfigurationshandbuch, um zu sehen, wann Sie die IP-Adresse korrigieren möchten
Was tun, wenn Sie Dateien remote von einem Windows-Client empfangen möchten?
Ich möchte Dunnetts Test in Python machen
Was tun, wenn die Pipenv-Shell nicht mehr möglich ist?
Wenn Sie Word Cloud erstellen möchten.
Wenn Sie den Chrome-Treiber aktualisieren möchten.
Ich möchte pyenv + pipenv auch unter Windows machen
Was tun, wenn Sie bei Verwendung von ortoolpy.logistics_network keine japanischen Spaltennamen verwenden möchten?
Was tun, wenn Sie mysqlclient nicht per Pip installieren können?
Kein Modul mit dem Namen Was tun, wenn Sie "libs.resources" erhalten?
ModuleNotFoundError: Kein Modul Was tun, wenn Sie'tensorflow.contrib 'erhalten?
Einstellungen, wenn Sie Python-Mecab mit Travis ausführen möchten
Wenn Sie Cython verwenden möchten, schließen Sie auch python-dev ein
Fragen Sie nicht "Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten?"
Wenn Sie mit dem Django REST-Framework filtern möchten
Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Wenn Sie in der for-Anweisung plt.save möchten
Die Programmiersprache, die Sie verwenden möchten
Ich möchte sagen, dass es eine Datenvorverarbeitung gibt ~
Ich möchte am Ende etwas mit Python machen
Ich möchte Wake On LAN vollautomatisch ausführen
Super einfache molekulare phylogenetische Baumerstellungstechnik, die ich niemandem beibringen möchte
[Python3] Code, der verwendet werden kann, wenn Sie die Größe von Bildern Ordner für Ordner ändern möchten
Golang: Die Angelegenheit, dass Sie den Prozess genau um 00:00 oder 30 Minuten im angegebenen Intervall ausführen möchten.