全面剖析PMD静态代码扫描工具

2023-11-09

PMD是使用JavaCC生成解析器来解析源代码并生成AST(抽象语法树)的,这两天对PMD及自定义规则做了调研及实验,部分说明来自官方说明文档,做了大部分参数的详细描述及测试,少数几个参数不明白含义,有了解的朋友欢迎讨论。

1     调研对象

pmd-bin-6.4.0【PMD可执行版本】

·      bin

·      designer.bat【界面工具,能将java源代码转化为AST(抽象语法树),个人推荐使用】

·      bgastviewer.bat【界面工具,与designer.bat功能相似】

·      cpd.bat【用来查找重复代码的工具,命令行版】

·      cpdgui.bat【用来查找重复代码的工具,GUI版】

·      pmd.bat【Window平台下运行PMD需要使用的文件】

·      run.sh【Linux平台下运行PMD需要使用的文件】

·      lib【该目录存放PMD运行依赖的jar包,包括第三方jar包和各种语言的模块jar包】

 

2 基本使用

格式:pmd -d [filename|jar or zip file containing source code|directory]-f [report format] -R [ruleset file]

示例:E:\pmd-bin-6.4.0>bin\pmd.bat -d E:\name -f html -R java-basic,java-design

如果要将生成的结果保存出来可以使用命令行重定向保存到指定路径——

E:\pmd-bin-6.4.0>bin\pmd.bat -d E:\name -f html -R java-basic,java-design>report.html

Option

Description

Required

Applies for language

-rulesets / -R

Comma separated list of ruleset names to use

yes

-dir / -d

Root directory for sources

yes

-format / -f

Report format type. Default format is `text`.

no

-auxclasspath

Specifies the classpath for libraries used by the source code. This is used by the type resolution. Alternatively a `file://` URL to a text file containing path elements on consecutive lines can be specified.

no

-uri / -u

Database URI for sources. If this is given, then you don't need to provide `-dir`.

no

plsql

-filelist

Path to file containing a comma delimited list of files to analyze. If this is given, then you don't need to provide `-dir`.

no

-debug / -verbose / -D / -V

Debug mode. Prints more log output.

no

-help / -h / -H

Display help on usage.

no

-encoding / -e

Specifies the character set encoding of the source code files PMD is reading (i.e. UTF-8). Default is `UTF-8`.

no

-threads / -t

Sets the number of threads used by PMD. Default is `1`. Set threads to '0' to disable multi-threading processing.

no

-benchmark / -b

Benchmark mode - output a benchmark report upon completion; defaults to System.err

no

-stress / -S

Performs a stress test.

no

-shortnames

Prints shortened filenames in the report.

no

-showsuppressed

Report should show suppressed rule violations.

no

-suppressmarker

Specifies the string that marks the line which PMD should ignore; default is `NOPMD`.

no

-minimumpriority / -min

Rule priority threshold; rules with lower priority than configured here won't be used. Default is `5` - which is the lowest priority.

no

-property / -P

`{name}={value}`: Define a property for a report format.

no

-reportfile / -r

Send report output to a file; default to System.out

no

-version / -v

Specify version of a language PMD should use.

no

-language / -l

Specify a language PMD should use.

no

-failOnViolation {true|false}

By default PMD exits with status 4 if violations are found. Disable this option with '-failOnViolation false' to exit with 0 instead and just write the report.

no

-cache

Specify a location for the analysis cache file to use. This can greatly improve analysis performance and is highly recommended.

no

-no-cache

Explicitly disable incremental analysis. This switch turns off suggestions to use Incremental Analysis, and causes the -cacheoption to be discarded if it is provided.


2 规则

2.1规则集

RuleCategories

PMD 自带了很多规则集合,并且分类写入不同的 ruleset 文件,如

Basic 包含每人都必须遵守的代码最佳实践,如EmptyCatchBlock

Braces 关于条件分支的规则,如IfStmtsMustUseBraces

Code Size 关于代码大小的规则,如方法的长度,参数的长度,属性的个数等

Clone 克隆实现的规则,如是否有super.clone()

Controversial 一些有争议的规则,如UnnecessaryConstructor不必要的构造器

Coupling 对象连接有关的规则

Design 可以检查有问题的设计,如SwitchStmtsShouldHaveDefault

Finalizers 使用finalizers时需遵循的规则,如FinalizeOnlyCallsSuperFinalize

Import Statements 和import有关的规则,如DuplicateImports重复import

J2EE 唯一规则UseProperClassLoader,class.getClassLoader()可能不正确,用

Thread.currentThread().getContextClassLoader() 代替

Javabeans 和javabean规范有关的规则,有BeanMembersShouldSerialize属性必须

序列化和MissingSerialVersionUID缺少序列化ID

JUnit Tests 和JUnit测试有关的,如JUnitSpelling拼写检查等

Logging (Java) 检查Logger的一些错误用法,如MoreThanOneLogger多个Logger

Logging (Jakarta) 使用Jakarta Logger的一些规则,有UseCorrectExceptionLogging

异常处理不当和ProperLogger是否正确定义Logger

Migrating JDK 版本移植的规则,如ReplaceVectorWithList用List代替Vector

Naming 和命名有关的规则,名称太短或太长,命名的约定等

 

2.2参数详情

● -dir/-d扫描目录

● -format/-f报告格式,有xml、xslt、html、text,默认为text

● -rulesets/R使用的规则集

● -auxclasspath

● -uri/-u源文件的数据库uri,使用它就不需要提供-dir

● -filelist一个包含逗号分隔的路径列表的文件,使用它就不需要提供-dir

示例:

命令:E:\pmd-bin-6.4.0>bin\pmd.bat -filelist E:\team-goblin\demo1\list.txt -f html -R myRule.xml

结果:

●    -debug / -verbose / -D / -V 打印更详细的日志

●    –help 显示用法帮助信息

●    -encoding / -e 字符集编码,默认为utf-8

●    -threads / -t 设置PMD使用的线程数。默认值是“1”。将线程设置为“0”以禁用多线程处理。

●    -benchmark / -b 基准模式-完成后输出基准测试报告

●    -stress / -S 进行压力测试

●    –shortnames 报告中打印缩短的文件名,只有在文件只有一个目录时是奏效

示例:

使用 –shortnames后:

●    –suppressmarker 指定一个字符串使得PMD忽略某行,默认为“NOPMD”。

示例1:

示例2:pmd.bat -d E:\team-goblin\demo1 -f html -RmyRule.xml -showsuppressed -suppressmarker allowint

●    – showsuppressesd 报告显示被忽略的违规行为

示例:bin\pmd.bat -d E:\team-goblin\demo1 -f html –R myRule.xml-showsuppressesd>report.html

●    –minimumpriority/-min

规则最小优先级阈值,默认为5,规则优先级低于它就不会被使用

示例:

pmd.bat-d E:\team-goblin\demo1 -f html -R myRule.xml -min 4

● –property/-P 为报告格式定义一个属性

● –language/-l 指定pmd使用的语言

【对扫描结果没有任何影响】

● - version 指定PMD使用的语言版本

● – failOnViolation {true|false} PMD默认会在发现违规情况时以状态4退出。使用“-failOnViolation false”禁用此选项,以0退出并且只写报告。

0

Everything is fine, no violations found

1

Couldn't understand command line parameters or PMD exited with an exception

4

At least one violation has been detected

● -cache指定要使用的分析缓存文件的位置。这可以大大提高分析性能,并被强烈推荐。

● –no-cache显式禁用增量分析。这个开关关闭了使用增量分析的建议,并导致-cache选项使用时无效

2.3 自定义规则

编写pmd规则有两种方法:

(1)用xpath,参考产生的AST树写xml

(2)用java code,需要深入了解pmd api,用于一些比较复杂的规则

2.3.1xpath自定义规则

使用PMD自带的designer.bat工具可以快速生成一个xpath rule xml。
(1)打开designer界面工具,输入源代码,输入XPath表达式,点击Go按钮,确认右下方的结果输出正确。


(2)点击左上方File->ExportXpath to rule


(3)在新的页面输入Rulename,Rule msg,Rule desc后,点击Create rule XML按钮,查看输出的结果。

示例:

判断非Integer的引用类型//Type/ReferenceType/ClassOrInterfaceType[@Image!="Integer"]

判断使用Int的基本类型

//Type/PrimitiveType[@Image="int"]

 

3 扩展

3.1 cpd.bat 重复代码检测

cpd.bat --minimum-tokens 100 --filesE:\team-goblin

--minimum-tokens 大于该值则认为代码重复

--files 扫描文件路径

SupportedLanguages

Apex
C#
C/C++
EcmaScript (JavaScript)
Fortran
Go
Groovy
Java
Jsp
Matlab
Objective-C
Perl
PHP
PL/SQL
Python
Ruby
Scala
Swift
Visualforce
Availableformats

text : Default format
xml
csv
csv_with_linecount_per_file
vs
 

参考资料:

360Test博客:点击打开链接

官方文档:点击打开链接
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全面剖析PMD静态代码扫描工具 的相关文章

  • Seq2Seq模型学习(pytorch)

    在看pytorch的官方英文例子 做些笔记 如有纰漏请指正 原文 https pytorch org tutorials beginner chatbot tutorial html 数据准备 首先是单词编码 seq2seq的单词编码的方式
  • 02-线性结构3 Reversing Linked List(PTA)

    02 线性结构3 Reversing Linked List 25 point s Given a constant K and a singly linked list L you are supposed to reverse the
  • MacOS 安装、卸载Homebrew

    MacOS 安装 卸载Homebrew 1 Homebrew官网地址 2 安装 在终端中输入下列代码 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew ins
  • Dockerfile build镜像的构建环境(build Context)

    文章目录 环境简介 执行构建 理解docker build 的工作原理 最佳实践 通过dockerfile定义文件和docker build命令构建 是推荐使用的镜像构建方式 通常在执行docker build的命令时 最后会加上 这个被当
  • ORA-01578: ORACLE 数据块损坏

    time 2008 6 12 18 35 author skate os winxp db 10g r2 错误提示 ORA 01578 ORACLE 数据块损坏 文件号 6 块号 20 ORA 01110 数据文件 6 F ORACLE P
  • 报错集----yum-config-manager

    关于yum config manager的讲解 问题描述 1 查看系统内已经拥有的仓库 2 使能要用的仓库 3 使用yum config manger 命令时 问题描述 yum是RPM的前端程序 对于多软件安装时非常好用 在虚拟机中想要安装
  • 最小二乘法的几种拟合函数

    目录 1 最小二乘法的原理和解决的问题 2 最小二乘法的公式解法 2 1 拟合h x a x 2 2 拟合 h x a0 a1 x 2 3拟合 h x a0 a1 x a3 x 3 因为采用矩阵法来进行最小二乘法的函数拟合时 会出现系数矩阵
  • 解决“在Debug模式下,多按几次自动运行,程序才可以可以运行起来”的问题方法

    今天来分享一个自己以前遇到过的一个在使用keil时候使用C库函数中的printf函数会出现的一种现象 话不多说 咱们先说一下现象 就是程序下载进去后不执行 就算是断电之后 再重新上电也没用 但是在Debug模式下 多按几次自动运行 程序就可
  • ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)

    今天 在单步调试程序时 对照引擎 突然有了些想法 以前没注意到 是因为以前都是用引擎的dll 并没有这么调试过 1 每个引擎都是有自己的初始化和帧循环 使用引擎的过程 就是相当于把引擎当做工厂 自己的数据相当于原材料 进行加工的过程 不同的
  • MySQL错误记录(1)--File './binlog.index' not found

    昨天感觉慢查询日志较大 然后在 var log 下面随意创建了一个mysql的slow log文件 把路径写入了my cnf文件中 结果今天启动机器发现mysql无法正常启动了 查看日志文件错误如下 一般发现 13 Permission d
  • 学习笔记-哈希表(散列)

    哈希表 散列 解决一个问题 有一个公司 当有新的员工来报道时 要求将该员工的信息加入 id 性别 年龄 住址 当输入该员工的 id 时 要求查找到该员工的所有信息 要求 不使用数据库 尽量节省内存 速度越快越好 gt 哈希表 散列 散列表
  • idea拉取Git代码重新输入用户信息操作

    IDEA修改git账号及密码的方法 file gt settings gt passwords 默认是保存了用户密码 直接选选择 Do not save 重新启动idea 再次拉取Git代码会提示输入用户名和密码弹框 输入用户名和密码后即可
  • Queue与Deque的区别

    前言 在研究java集合源码的时候 发现了一个很少用但是很有趣的点 Queue以及Deque 平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用 但是一直都不知道Queue的作用 于是就直接官方文档好了
  • Linux系统的LOG日志文件及入侵后日志的清除

    UNIX网管员主要是靠系统的LOG 来获得入侵的痕迹 当然也有第三方工具记录入侵系统的 痕迹 UNIX系统存放LOG文件 普通位置如下 usr adm 早期版本的UNIX var adm 新一点的版本使用这个位置 var log 一些版本的
  • 华为机试HJ99 自守数

    HJ99 自守数 Python 题目 解题思路 代码 结果 题目 解题思路 1 多组输入 需要循环 2 n以内 从0到n 循环就要记得有n 循环判断平方后的字符串以n的字符串结尾 来判断是自守数 代码 while True try n in
  • 宏、条件编译(#ifdef)、#include(头文件包含)、#error和 #pragma的区别、#和##的含义和应用

    1 在C语言预处理阶段 编译器首先对代码的处理时 先去注释 再宏替换 2 在源文件的任何地方 宏都是可以定义的 与是否在函数内外无关 3 宏的作用范围是 从定义处开始 往后的直到程序结束都是有效的 可以使用 undef取消宏定义的 4 if
  • redis 从机出现master_link_status:down提示解决方法

    小编使用的redis的版本号是5 0 5 可能会略有不同 例如redis conf配置文件中 没有slaveof这一项配置 使用命令配置主从复制 今天在使用命令slaveof或者是replicaof命令配置redis主从复制时 从机出现ma
  • Vue——vuedraggable拖拽组件使用文档总结

    vuedraggable官方文档地址 https www itxst com vue draggable j6vzfv6r html Draggable为基于Sortable js的vue组件 用以实现拖拽功能 关于Vue Draggabl
  • ue5获取从http中get到的json信息的蓝图节点是什么?

    在 Unreal Engine 5 UE5 中 您可以使用 HTTP 请求 蓝图节点来发送 HTTP 请求 并使用 HTTP 响应 蓝图节点来获取 HTTP 响应 要获取从 HTTP 中 GET 到的 JSON 信息 您需要执行以下步骤 使

随机推荐

  • webpack之externals解析

    1 是什么 指定排除掉不想被webpack打包的模块 被排除掉的模块 是要在运行时依赖用户环境去获取的 所以 用户的环境必须有被排除掉的包 2 既然模块不被打包 那么项目中的引入语句如何处理呢 webpack会根据你对模块的配置 将引入语句
  • CentOS7(Linux)详细安装教程(图文详解)

    一 软件准备 本文CentOS7安装在VMware Workstation虚拟机软件 故安装前请自行安装该软件 VMware Workstation官网链接 VMware Workstation官网地址 CentOS7下载地址 centos
  • 技术运营的工作是什么?

    什么是技术运营 技术运营到底是干什么的 本问作者艺璇分享了她的工作心得 关于作者 我于15年本科毕业加入阿里 4年前端开发 4年技术运营 目前主要工作方向是技术发展和技术影响力的打造 很开心受到邀请 来跟大家一起分享交流下 主要包含以下几部
  • 面试高频:为什么不用定时任务实现关闭订单?

    在电商 支付等领域 往往会有这样的场景 用户下单后放弃支付了 那这笔订单会在指定的时间段后进行关闭操作 细心的你一定发现了像某宝 某东都有这样的逻辑 而且时间很准确 误差在1s内 那他们是怎么实现的呢 一般的做法有如下几种 定时任务关闭订单
  • pytest当中conftest.py的使用

    目录 一 规则 1 conftest py文件是单独存放的一个单独夹具文件 名称不可修改 2 用处可以在不同的py文件当中使用同一个fixture函数 3 原则conftest py 要和运行的用例放在同一层级 例如testcase包下面
  • centos7服务器升级harbor-2.0.6至2.7.0

    centos7服务器升级harbor 2 0 6至2 7 0 1 升级harbor 2 0 6至2 4 0 使用指南 由于2 0 6版本不能直接升级到2 7 0版本 所以需要先过渡到2 4 0版本 原因是PG版本升级不兼容 2 0 6使用P
  • 如何利用TL431设计一个可调电压源

    TL431是一个三脚电压可控的稳压器件 常用的封装有TO 92 SOT 23 SOT 89 电路符号是这个 TL431常被用在参考电压 基准电压电路 用来替代稳压管 其中1脚是reference 2脚是Anode 3脚是Cathode TL
  • ARP(地址解析协议)

    ARP Address Resolution Protocol 地址解析协议 可以在以太网上 根据已知的IP地址查找主机的硬件地址 一 ARP的工作原理 我们以以太网的工作环境作为背景来探讨这一协议 串行链路由于是点到点链路 故而不需要AR
  • 微信网页开发分享

    首先提供一个微信官方地址点击打开链接 早期web项目中经常用到微信分享功能 现在整理一下 供记忆与分享 开发环境为JAVA H5 1 微信的开发环境不在多说 大概为 使用已备案的域名 设置 公众号设置 的三项域名 设置开发者密码 AppSe
  • Java直接杀死线程方法_如何杀死一个线程?

    1 简介 在这篇短文中 我们将讲述一下java中如果结束一个线程 事实上 这并没有想象中的那么简单 因为 Thread stop 方法已经被废弃啦 根据Oracle的解释 stop 方法可以导致被监视对象遭受破坏 2 使用一个Flag 我们
  • DWT数字水印算法(Python)

    DWT数字水印算法的基本原理 结合Arnold变换的基于DWT的数字水印的嵌入 充分利用了小波变换的特点 采用Haar小波 把原始图像及水印图像进行三级小波分解 然后在多分辨率分解后的频段嵌入水印信号 得到嵌入水印的图像 数字水印最重要的性
  • Keil5识别不到ST-Link的解决办法

    刚开始还以为是pack的问题 下载好多pack也没解决 后来发现其实是驱动的问题 从官网上下载驱动 之后进行基本的配置 如下所示 点击魔术棒标志 然后 然后 点击settings 点击add 添加自己的芯片类型 选择erase full c
  • 基于BERT模型实现文本分类任务(transformers+torch)

    BERT的原理分析可以看这 BERT Pre training of Deep Bidirectional Transformers for Language Understanding 论文笔记 代码实现主要用到huggingface的t
  • 如何保证MQ不丢失信息

    为了保证消息队列 MQ 不丢失信息 有以下几种方法可以考虑 增加冗余 通过将数据存储到多个不同的地方来防止数据丢失 使用持久化存储 通过将数据存储到磁盘上 而不是内存中 以确保数据不会丢失 引入数据备份 定期对数据进行备份 以防止意外数据丢
  • 二. go 常见控制结构实现原理之 select

    目录 一 基础问题 select 与channel select 与 channel 二 实现原理 1 select 底层结构 2 select选择case的执行逻辑 一 基础问题 select是Golang在语言层面提供的多路IO复用的机
  • Vue基础--组件的创建和使用

    一 组件化思想 一个页面中所有的处理概述逻辑全部放在一起 处理起来就会变得非常复杂 不利于后续的管理以及扩展 但是 我们将一个页面逻辑复杂的页面拆分成一个个小的功能块 每个功能块只完成属于自己这部分独立的功能 把大功能拆分成一个个小的功能
  • 51单片机0-9数字LED灯循环输出

    代码 include
  • 703n的OpenWrt配置一:安装和基本设置

    OpenWrt支持的路由可以从官网查到 顺藤摸瓜也可以找到固件的下载地址 如果知道路由器的cpu也可以从这里分类查找路由器型号 对于703n的ar71xx就是点我里面搜索703n找到的那几个文件 挑最小的固件下载 这样可以剩下更多空间安装其
  • 【C++】类的默认成员函数——构造函数、析构函数、拷贝构造函数、赋值运算符重载

    文章目录 一 前言 二 构造函数 1 基本概念 2 初始化列表 3 自动生成的构造函数 三 析构函数 1 基本概念 2 自动生成的析构函数 四 拷贝构造函数 1 基本概念 2 自动生成的拷贝构造函数 五 赋值运算符重载 1 基本概念 2 自
  • 全面剖析PMD静态代码扫描工具

    PMD是使用JavaCC生成解析器来解析源代码并生成AST 抽象语法树 的 这两天对PMD及自定义规则做了调研及实验 部分说明来自官方说明文档 做了大部分参数的详细描述及测试 少数几个参数不明白含义 有了解的朋友欢迎讨论 1 调研对象 pm