首页 > *nix技术 > 重复代码检测工具pmd-cpd调研

重复代码检测工具pmd-cpd调研

2021年10月30日 发表评论 阅读评论 2,526 次浏览

最近在看有没有好的工具可以检测重复代码,最好能支持增量检测,建一个类似于论文查重的服务系统。
代码查重的工具有很多,比如pmd-cpd,但都是一次性的执行工具,暂未找到一个完整的服务系统来实现查重服务。
找到有几个类似的项目:

https://github.com/zhangkun-jser/code-recheck

https://github.com/fanghon/antiplag

但不太适合,先看看cpd,大不了对cpd做二次开发了。

一,在windows7上试运行pmd

https://pmd.github.io/pmd-6.39.0/pmd_userdocs_cpd.html

1,安装Java运行环境:

https://www.oracle.com/java/technologies/downloads/#jdk17-windows

https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe

运行安装后,设置环境变量->系统变量,
新增JAVA_HOME:C:\Program Files\Java\jdk-17.0.1
把C:\Program Files\Java\jdk-17.0.1\bin;加到Path变量最前面。
在cmd管理员命令窗口里执行java –version无报错即可。

2,下载最新的pmd包:

https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.39.0/pmd-bin-6.39.0.zip

把zip包解压,然后把对应的X:\…\pmd-bin-6.39.0\bin添加到系统PATH路径,方便后续使用。

3,准备测试代码
a) 找份Nginx源码,解压,然后测试:
# cpd –minimum-tokens 300 –files C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\c
ore –language c –format csv
lines,tokens,occurrences
16,333,2,1259,C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\core\ngx_string.c,1286,
C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\core\ngx_string.c
找到对应位置看了下,是固定basis64解码重复。

b) 把ngx_array.c复制一份代码试试:
# cpd –minimum-tokens 300 –files C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\c
ore –language c –format csv
lines,tokens,occurrences
130,550,2,12,C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\core\ngx_array – 副本.c,
12,C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\core\ngx_array.c
16,333,2,1259,C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\core\ngx_string.c,1286,
C:\test\nginx-1.19.8.tar\nginx-1.19.8\src\core\ngx_string.c
能检测到两个文件重复。

c) 把头文件ngx_array.h复制一份再检测,发现检测不出来。
应该是language参数指定了只检测c源文件?

二,源码编译pmd
0,参考:https://pmd.github.io/pmd-6.39.0/pmd_devdocs_building.html
备注:在windows上总是编译失败,下面在ubuntu上试试。

1,操作系统
ubuntukylin 20.04

2,先安装JDK
sudo apt-get install openjdk-17-jdk

3,下载源码,解压,然后cd到对应的目录,并执行对应的编译命令:
$ unzip pmd-src-6.32.0.zip
$ cd pmd-src-6.32.0/
$ chmod a+x mvnw do-release.sh
$ ./mvnw clean verify

第一次编译会下载一些东西,类似这种:
[INFO] Scanning for projects…
Downloading from central: https://repo.maven.apache.org/maven2/org/sonatype/plug
ins/nexus-staging-maven-plugin/1.6.8/nexus-staging-maven-plugin-1.6.8.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/sonatype/plugi
ns/nexus-staging-maven-plugin/1.6.8/nexus-staging-maven-plugin-1.6.8.pom (12 kB
at 8.9 kB/s)

会下载很多依赖包,等待一段时间。

还是失败,看了下是后面的模块编译失败,先不管,后面的模块暂时也不用,直接修改源码目录下的pom.xml,
把modules里的其他模
块都注释掉,只留下pmd-core、pmd-cpp和pmd-dist。再编译,就成功了。
[INFO] BUILD SUCCESS
进入pmd-src-6.32.0/pmd-dist/target目录后,可以看到编译结果:pmd-bin-6.32.0.zip

解压后使用:
pmd-bin-6.32.0/bin$ ./run.sh cpdgui

扫了一个cpp工程,正常。

三,转换为eclipse工程,方便编译和调试
0,JDK在前面已经安装,跳过。
1,安装eclipse
a) 下载eclipse安装包

https://www.eclipse.org/downloads/packages/

https://mirrors.neusoft.edu.cn/eclipse/technology/epp/downloads/release/2021-09/R/

eclipse-java-2021-09-R-linux-gtk-x86_64.tar.gz

b) 解压即可:
$ tar xf eclipse-java-2021-09-R-linux-gtk-x86_64.tar.gz
$ cd eclipse/
$ ./eclipse
即可启动eclipse。

c) 解压一份pmd代码
$ unzip pmd-src-6.32.0.zip
$ cd pmd-src-6.32.0/
$ pwd
/home/lenky/tmp/eclipse/pmd-src-6.32.0

d) 导入eclipse
File -> Import -> Maven -> Existing Maven Projects
把Root Directory选择/home/lenky/tmp/eclipse/pmd-src-6.32.0即可。

c) 运行cpd
右键pmd工程,Run As -> Run Configurations -> Java Application -> New
Project选:pmd-core
Main class选:net.sourceforge.pmd.cpd.CPD
Arguments的Program arguments里填:
–minimum-tokens 70 –files /home/lenky/tmp/pmd-src-6.32.0 –language java –format csv

再分别点击Apply,Run,就能在eclipse的Console里看到输出结果了。
用Debug调试,正常,很好,可以轻松的探索pmd-cpd的内部细节了。调试界面截图

查了很多参考资料,记录下:
技术债:

https://www.cnblogs.com/daodaotest/p/12460594.html

https://blog.csdn.net/vipshop_fin_dev/article/details/108179173

https://www.bmc.com/blogs/technical-debt-explained-the-complete-guide-to-understanding-and-dealing-with-technical-debt/

https://baijiahao.baidu.com/s?id=1683688665237098667&wfr=spider&for=pc

https://www.cnblogs.com/brendabao/archive/2010/12/21/1912432.html

https://www.sonarsource.com/

https://blog.csdn.net/weixin_39913716/article/details/82189692

https://www.oschina.net/translate/evaluate-your-technical-debt-with-sonar

https://blog.csdn.net/lxlmycsdnfree/article/details/80166335

https://cloud.tencent.com/developer/article/1415947

https://cloud.tencent.com/developer/article/1192182?from=article.detail.1415947

https://zhuanlan.zhihu.com/p/68137620

https://baijiahao.baidu.com/s?id=1707987464146518453&wfr=spider&for=pc

https://zhuanlan.zhihu.com/p/140956965

https://www.cnblogs.com/sulanyuan/p/13890890.html

https://blog.csdn.net/k6T9Q8XKs6iIkZPPIFq/article/details/103917974

http://docs.sangfor.org/pages/viewpage.action?pageId=145472521

http://200.200.1.35/coding/style/code-portability.html

https://docs.atrust.sangfor.com/pages/viewpage.action?pageId=150071295

http://200.200.1.35/designing/procedure/design_quality_evaluation.html

https://www.n-ix.com/reduce-technical-debt/

重复代码检测工具:

https://blog.csdn.net/cn_tangzheng/article/details/109244806

https://www.jianshu.com/p/59a6d409b8c4

https://www.sonarqube.org/trial-request/developer-edition/

http://www.harukizaemon.com/simian/features.html

https://pmd.github.io/pmd-6.39.0/

https://www.zhihu.com/question/348205009

https://pmd.github.io/pmd-6.39.0/pmd_userdocs_cpd.html#why-should-you-care-about-duplicates

https://blog.csdn.net/yourenshuo/article/details/84896031

https://docs.sonarqube.org/latest/instance-administration/plugin-version-matrix/

https://pmd.github.io/pmd-6.39.0/pmd_devdocs_building.html

https://pmd.github.io/pmd-6.39.0/pmd_userdocs_cpd.html

https://www.cnblogs.com/wuyudong/p/karp-rabin-algorithm.html

https://blog.csdn.net/lucylove3943/article/details/83491416

转载请保留地址:http://www.lenky.info/archives/2021/10/2990http://lenky.info/?p=2990


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

分类: *nix技术 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.