[PYTHON] Voulez-vous que je corrige cette copie?

Il n'est pas rare de dire que les clones de code copier-coller du code source sont plus fiables, mais dans de nombreux cas, la présence de clones de code nous afflige souvent à la dernière minute.

Après que le responsable s'est enfui, a corrigé le code source jusque tard dans la nuit et l'a publié, en fait, il a dit: "Je le fais avec du copier-coller, alors s'il vous plaît, corrigez tout le reste et testez-le." Est très, très triste.

C'est une humiliation de modifier presque le même code source en le changeant subtilement comme à la recherche d'une erreur.

À la dernière minute, pour éviter de tels jeux de punition, la fréquence de copie doit être surveillée à tout moment et toute fréquence inhabituelle doit être corrigée immédiatement.

Cette section décrit les outils de détection du copier-coller.

PMD-CPD PMD est un outil de détection de problèmes potentiels dans le code source Java implémenté en Java. http://pmd.sourceforge.net/snapshot/

Une partie de cette fonctionnalité est la commande CPD, qui détecte le code en double et peut détecter les doublons dans les langages de programmation suivants: ・ Java ・ JSP ・ C ++ ・ Rubis ・ Fortran ・ PHP ・ C # ・ PLSQL ・ Ecmascript

Comment installer

Téléchargez l'un des fichiers suivants, décompressez-le et extrayez-le dans n'importe quel dossier. http://sourceforge.net/projects/pmd/files/pmd/

Exemple d'exécution

Exemple d'exécution sous Windows

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

Exemple d'exécution sous Linux

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

Paramètres

Les paramètres sont partagés entre Windows et Linux.

Paramètres La description
--minimum-tokens Spécifiez le nombre de jetons pour détecter les doublons.
--format text,xml,Vous pouvez sélectionner csv. Si vous le sortez en xml, vous pouvez l'utiliser dans jenkins.
--language Spécifie le type de langage de programmation.
--files Spécifiez le répertoire du code source à inspecter. Ceci est détecté de manière récursive.
--encoding Spécifie le codage du code source à inspecter

GUI Vous pouvez également travailler avec l'interface graphique en exécutant bin / cpdgui.bat. clone.png

Clonedigger Clonedigger est un outil de détection de copier / coller implémenté en Python et Java. http://clonedigger.sourceforge.net/

Les langages de programmation découvrables sont:

・ Python ・ Java ・ Lua ・ Javascript

Voici quelques conseils ci-dessous pour détecter les langages de programmation autres que python.

Comment installer

easy_install clonedigger

Exemple d'exécution

Exemple de détection Python

__ Si vous spécifiez un fichier __

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

__Si vous spécifiez un dossier __

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

Si vous spécifiez un dossier, les sous-dossiers sont également détectés. Crée le code HTML suivant dans le fichier spécifié par -o.

clone.png

Si vous utilisez l'option --cpd-output comme suit, elle sera sortie au format XML. Ce format de sortie est le même que PMD / CPD.

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

Exemple de détection Java

Lors de la détection de code source autre que Python, cela ne fonctionnera que si java_antlr existe dans le répertoire courant. Pour Windows et Python 2.7, les opérations suivantes sont requises.

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

Exemple de détection JavaScript

Lors de la détection de JavaScript, cela ne fonctionnera que si js_antlr existe dans le répertoire courant. Pour Windows et Python 2.7, les opérations suivantes sont requises.

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 qui s'exécute dans le navigateur fonctionne également avec l'implémentation bâclée suivante.

  //Dernière virgule supplémentaire
  var questions = [
    {message: "Ah ah", category: Category.emotionalExhaustion} ,
  ];

Cependant, dans clonedigger, s'il existe une telle description invalide, l'analyse sera interrompue et une erreur se produira. À ce moment, le message d'erreur suivant s'affichera, ce qui sera un conseil pour la correction.

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

AIST CCFinderX Vous pouvez télécharger AIST CC Finder X, qui a été dit dans les commentaires, à partir de la page suivante. http://www.ccfinder.net/ccfinderxos-j.html

Il nécessite Java 32 bits et Python 2.6 (pas de haut ni de bas) pour fonctionner. Si vous téléchargez le binaire Windows, il ne fonctionnera que si vous l'exécutez sur 32 bits, vous devez donc modifier gemx.bat comme suit.

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

L'image suivante est un exemple de l'écran détecté par gem x.bat. 無題.png

En outre, vous pouvez également afficher un diagramme de dispersion. Ces interfaces graphiques sont fascinantes.

Lorsqu'il est exécuté à partir de la ligne de commande:

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

La sortie a.ccfxd à ce moment est un fichier binaire qui peut être ouvert avec GemX. Vous pouvez le convertir au format texte avec la commande suivante.

>ccfx p a.ccfxd > test.txt

Prise en charge de Visual Basic

Visual Basic est rarement pris en charge en tant qu'outil de ce type. Il semble que le code réalisé avec VB6 et VBA soit également analysé. Cependant, il ne reconnaît pas le fichier cls, modifiez donc ccfx_prep_scripts.ini comme suit.

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

Autre

-Le traitement des sources qui gèrent plusieurs octets peut avoir échoué. ・ Autant que j'ai enquêté, il semble peu probable que la coopération avec Jenkins soit facile. -La page d'historique de mise à jour étant un lien mort, il semble qu'elle ne soit plus maintenue. J'ai le code source, donc je vais devoir le réparer moi-même si nécessaire.

Surveillance par Jenkins

Vous pouvez surveiller les transitions de clonage de code avec le plug-in Jenkins Violations. https://wiki.jenkins-ci.org/display/JENKINS/Violations

  1. Générez du XML sur l'espace de travail sur le script Jenkins.

  2. Dans le processus de post-génération des paramètres du projet, spécifiez le code XML de 1. dans le cpd de Report Violations. clone.png

  3. Chaque build créera un rapport comme celui ci-dessous. clone.png

Recommended Posts

Voulez-vous que je corrige cette copie?
Résumons ce que vous voulez faire.
Liens pour faire ce que vous voulez avec Sublime Text
[AWS] Que faire lorsque vous souhaitez piper avec Lambda
[AWS EC2] Paramètres que vous souhaitez effectuer sur Amazon Linux 2
Je veux faire ○○ avec les Pandas
Je veux copier l'annotation de yolo
Voulez-vous attendre un usage général avec Python Selenium?
Vous ne voulez pas dire que vous avez créé un programme de reconnaissance faciale?
Deux outils de génération de documents que vous souhaitez absolument utiliser si vous écrivez python
Comment écrire des variables d'environnement que vous ne voulez pas mettre sur [GitHub] Python
Gérez CSV avec l'élément que vous souhaitez analyser dans le nom du fichier
[Linux] Vous ne disposez pas des privilèges root. Mais je veux yum installer.
Linux: guide de configuration Netplan pour savoir quand vous souhaitez corriger l'adresse IP
Que faire lorsque vous souhaitez recevoir des fichiers à distance depuis un client Windows
Je veux faire le test de Dunnett en Python
Que faire lorsque le shell pipenv devient impossible
Si vous souhaitez créer Word Cloud.
Lorsque vous souhaitez mettre à jour le pilote Chrome.
Je veux faire pyenv + pipenv même sous Windows
Que faire si vous ne souhaitez pas utiliser de noms de colonnes japonais lors de l'utilisation d'ortoolpy.logistics_network
Que faire si vous ne pouvez pas installer mysqlclient
Aucun module nommé Que faire si vous obtenez "libs.resources"
ModuleNotFoundError: No module Que faire si vous obtenez 'sensorflow.contrib'
Paramètres lorsque vous souhaitez exécuter python-mecab avec travis
Si vous souhaitez utiliser Cython, incluez également python-dev
Ne demandez pas "Êtes-vous sûr de vouloir continuer à vous connecter"
Lorsque vous souhaitez filtrer avec le framework Django REST
Choses à faire lorsque vous commencez à développer avec Django
Lorsque vous voulez plt.save dans l'instruction for
Le langage de programmation que vous souhaitez pouvoir utiliser
Je veux dire qu'il y a un prétraitement des données ~
Je veux faire quelque chose avec Python à la fin
Je veux faire Wake On LAN de manière entièrement automatique
Technique de création d'arbre phylogénétique moléculaire super facile que je ne veux enseigner à personne
[Python3] Code qui peut être utilisé lorsque vous souhaitez redimensionner des images dossier par dossier
Golang: La question que vous souhaitez exécuter le processus à exactement 00:00 ou 30 minutes à l'intervalle spécifié.