pmd java规则_静态代码扫描 (一)——PMD 自定义规则入门

2023-11-19

阅读该文章前,最好已经对 PMD 有了初步的认识和了解,可参考静态分析工具 PMD 使用说明

准备工作

首先在PMD 官网下载最新版本的文件,目前最新版本是 5.4.1。

下载 pmd-bin-5.4.1.zip 和 pmd-src-5.4.1.zip 之后解压备用。

pmd-src-5.4.1 是 PMD 源码包,是无法直接执行的。

pmd-bin-5.4.1 是 PMD 的可执行包。

目录简介

pmd-bin-5.4.1【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 包】

pmd-src-5.4.1【PMD 源代码版本】

pmd-core【PMD 的核心执行调度模块】

pmd-java【针对 java 语言的检测模块】

src ->main

java -> net -> sourceforge -> pmd -> lang->java【目录太深,在此处聚合】

rule【该目录下存放已经编写好的 java 规则文件】

basic【基础类规则】

AvoidBranchingStatementAsLastInLoopRule.java【避免在循环的最后使用分支语句】

AvoidMultipleUnaryOperatorsRule.java【避免一元运算符的多重使用】

...【其他基础类的规则文件】

codesize【代码体积类规则】

...【各种规则类别的目录,包含该类别的 java 编写的规则文件】

resources

rulesets【java 规则对应的 xml 文件】

java

android.xml【PMD 运行时使用该文件会调用安卓类规则进行扫描】

basic.xml【PMD 运行时使用该文件会调用基础类规则进行扫描】

...【其他类别的规则 xml 文件】

etc

grammar

Java.jjt【AST 抽象语法树生成所需的语法文件】

pmd-java8【新增对 java1.8 版本的支持模块】

pmd-javascript【针对 javascript 语言的检测模块】

pmd-jsp【针对 jsp 语言的检测模块】

...【其余的主要是针对不同语言实现的独立的检测模块】

自定义规则实现思路

明确想要自定义的规则。

列举会触犯这种规则的所有不同的写法。

使用 designer.bat 分析所有写法的抽象语法树的特点。

编写规则代码捕捉这种特点。

创建自己的 xml 规则文件,内容包括规则的相关信息。

运行 PMD 扫描错误代码,验证是否能触发自定义规则。

下面以一个比较简单的规则举例,详细的阐述一下实现这个规则的具体步骤,帮助大家快速上手。

目前 PMD 支持两种编写规则的方法:

使用 Java 进行编写

使用 XPath 表达式

我首先选择第一种 Java 编写方式进行讲解。

****

1. 明确想要自定

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

pmd java规则_静态代码扫描 (一)——PMD 自定义规则入门 的相关文章

  • python爬取考研网的信息

    今天我们使用python来爬取考研网站的信息 目标网站 https yz chsi com cn zsml queryAction do 使用的库 requests bs4 pandas 这些库统一可以使用pip进行统一安装 pip ins
  • VSCode 插件安装:中文(简体)语言包(附带:不生效解决方案)

    文章目录 VSCode 安装插件 中文 简体 语言包 中文语言包不生效解决方案 打开 命令面板 配置显示语言 选择中文 重启VSCode 效果 中文界面 VSCode 安装插件 中文 简体 语言包 插件市场搜索 中文 选择如下插件安装 Ch
  • Vue3自定义指令之前端水印功能实现

    一 前置知识 Vue 中的自定义指令 先来说说 vue2和vue3中自定义全局指令的区别 相同点 指令的应用场景 原理是一致的 不同点 生命周期钩子函数名 指令定义的格式不一样 vue2中自定义全局指令 定义 注册一个全局自定义指令 v f
  • 一篇关于如何用深度学习完成自动上色(Automatic Image Colorization)的论文浅析

    论文标题是 Let there be Color Joint End to end Learning of Global and Local Image Priors for Automatic Image Colorization wit
  • 【转载】英语动词过去式ed的发音规则

    规则动词词尾加 ed有三种读音 1 在清辅音后读作 t 如 asked helped watched stopped 2 在浊辅音和元音后读作 d 如 enjoyed studied moved called 3 在t d后读作 id 如
  • 基于vue-cli3模板的axios封装项目

    为了更便捷的使用项目框架 本模板为空白项目 但是已经为大家封装了axios方法和post get请求 内有基础案例 请大家按着自己项目需要进行修改使用 axios interceptors response use response gt
  • 采样位数、采样率、波特率

    实例 16bit 16K 115200 1 采样位数 即采样值或取样值 就是将采样样本幅度量化 它是用来衡量声音波动变化的一个参数 也可以说是声卡的分辨率 它的数值越大 分辨率也就越高 所发出声音的能力越强 在计算机中采样位数一般有8位和1
  • Spring Cloud 微服务

    Spring Cloud 微服务架构介绍 单体架构 单体架构也称之为单体系统或者是单体应用 就是把系统中所有的功能 模块耦合在一个应用中的架构方式 特点 打包成一个独立的单元 导成一个唯一的 jar 包或者是 war 包 会一个进程的方式来
  • 金算盘高手论坛资料中心_3D006期 菜鸟论坛精英PK专栏 速来围观!!

    点上方 菜鸟选号论坛 点右上角 选 星标 每日上午更新 星标置顶与大神不走散 苹果是置顶 安卓是星标 点击 菜鸟选号论坛 关注我们 论坛明星版块 集全网各路高手之大乘 打造草根明星 展示舞台 同时主要是为广大关注彩友 在每一期 推出个人擅长
  • swift编程入门(非常详细)从零基础入门到精通,看完这一篇就够了

    文章目录 1 读后概述 2 语法笔记 2 1 说明 2 2 基础类型 2 3 运算符 2 4 字符与字符串 2 4 控制流 2 5 函数 2 6 闭包 2 7 枚举 结构体 类 2 8 类的构造与析构 2 9 属性监听器 2 10 类的继承
  • python 图像处理(7):对比度与亮度调整

    图像亮度与对比度的调整 是放在skimage包的exposure模块里面 1 gamma调整 原理 I Ig 对原图像的像素 进行幂运算 得到新的像素值 公式中的g就是gamma值 如果gamma gt 1 新图像比原图像暗 如果gamma
  • 毕业设计-基于微信小程序的电影推荐系统

    目录 前言 课题背景与简介 实现设计思路 一 电影推荐算法的设计与实现 二 电影推荐系统分析与设计 实现效果样例 更多帮助 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 基于情感词典的情感分析

    思路以及代码都来源于下面两篇文章 一个不知死活的胖子 Python做文本情感分析之情感极性分析 Ran Fengzheng 的博客 基于情感词典的文本情感极性分析相关代码 基于情感词典的情感分析应该是最简单的情感分析方法了 大致说一下使用情
  • http服务器_本地简易http服务器

    本地简易http服务器 下面实现一个简单的http服务器 听起来高大上的样子 其实就是网络通信加上http协议 运用上篇的网络编程的基础模型 上篇的网络通信是开两个vs程序 一个做服务器 一个做客户端 互相发送数据 http服务器其实也是同
  • 【Unity-学习-021】异步实现HTTP请求

    对Http访问操作 Unity中一般使用协程操作 但是协程有一个比较要命的要求就是所在Mono必须在场景中是激活的 所以一些操作就会被限制 所以我们就找办法替代掉协程做一些异步的操作 那就用异步方法 首先扩展一下AsyncOperation
  • java操作RabbitMQ

    文章目录 一 基本消息模型 1 导入依赖 2 准备连接工具类 3 创建消息发送者 生产者 4 创建消息接受者 消费者 5 消息确认机制 ACK 二 Work queues 1 创建消息发送者 2 创建多个消息接受者 3 测试 4 设置能者多
  • QtIFW:制作程序安装包

    程序发布方式一般有两种 1 静态编译发布 这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中 其优势是简单单一 所有的依赖库都集中在一起 其缺点也很明显 可执行程序体量较大 2 制作安装包发布 这种方式的原理也简单 就是将
  • 输入延时(Input Delay)与输出延时(Output Delay)

    一 设置输入延时 Input Delay 1 不同的路径需要使用不同的约束 2 输入延时的定义 由下图可以看出Input Delay是以上游芯片的时钟发送沿为参考 上游的输出数据到达FPGA的外部输入端口之间的延迟 输入延迟 input d
  • 你也想拥有你的个人博客吗(阿里云域名+github方案+hexo)

    虽然平时学习有写笔记的习惯 可是都没有上传过 记录一下学习日常吧 以后也会更容易整理了 因为在每个版本 对各个设备的配置情况都有一些细小的区别 希望我的记录也同时可以帮助一下需要的朋友 现在的时间点是2020 9 28 我的电脑是 MacB

随机推荐

  • runtime属性的读与写

    文章目录 通过ivar读 写 举例 通过ivar读 写 这里以Person类为例 来看怎么对属性值进行操作 Person类有一个属性name property nonatomic copy NSString name 对应的变量名 name
  • Stream流还可以这样用,省时又省力,你不知道的去重方法,快来一起解决这道常见的面试题吧

    下面归纳出几种常见的去重方法 使用stream流collectingAndThen 根据某一属性去重 studentList studentList stream collect Collectors collectingAndThen C
  • Solidworks的simulation组合分析显示单独零件

    具体参考以下链接 https jingyan baidu com article f96699bbe98e8e894f3c1b59 html
  • QT QTabWidget

    QTabWidget 使用 1 1 ui界面添加tabWidget 想展示的Widget 1 2 TabWidget 动态添加tab 1 3 tabWidget 动态删除tab 1 4 TabWidget 获取所有tab的界面值 2 1 T
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 单链表——多项式相加

    时间限制 1000ms 内存限制 256M 实验目的 编写代码 使用两个单链表表示下面的多项式 完成两个多项式相加 并输出相加后的多项式结果 实验要求 1 单链表的类型定义如下 typedef int datatype 结点数据类型 假设为
  • Linux学习(八):文件名的查找Find

    Find 一 时间维度 atime ctime mtime 以 mtime为例 mtime n n为数字 意义为在n天之前的 一天之内 被更改过的文件 mtime n 列出在n天之前 不包含n本身 被更改过的文件 mtime n 列出在n天
  • linux超级工具,linux运维超级工具--sysdig

    sysdig 是一个超级系统工具 它可以用来捕获系统状态信息 在运维工作中sysdig能很方便的排查异常 定位故障 它还能保存数据进行分析 并且提供强大的命令接口 在了解sysdig强大之处之前 首先得安装sysdig 我这里是环境是cen
  • 【计算机网络13】网络安全

    文章目录 1 HTTP协议的安全问题 2 单向散列函数 One way hash function 2 1 单向散列函数的特点 2 2 常见的几种单向散列函数 2 3 防止数据被篡改 2 4 几个网站 3 对称加密 Symmetric Cr
  • Filebench 使用手册

    Filebench 使用手册 介绍 Filebench 是一个文件系统和存储基准 可以生成各种各样的工作负载 与典型的基准测试不同 它非常灵活 允许使用其广泛的工作负载模型语言 WML 指定应用程序的 I O 行为 用户可以从头开始描述所需
  • 当矩阵的秩小于未知数的个数时,方程组有无数个解;当矩阵的秩等于未知数的个数时,方程组只有零解。...

    当矩阵的秩小于未知数的个数时 方程组有无数个解 当矩阵的秩等于未知数的个数时 方程组只有零解 转载于 https www cnblogs com 2019 02 11 p 10586212 html
  • springboot配置启动后自动打开浏览器访问项目

    springboot配置项目启动后自动打开浏览器访问项目 有时候在单机部署 或者项目没有在IDea 开发工具中运行 idea可以自动打开tomcat项目 需要项目启动后自动打开浏览器访问项目 配置方法很简单 一 具体步骤 所用到的代码只有下
  • QT在图片中间绘制文字,获取文字size 和 pos

    QFont ft this gt font 获取系统当前字体对象 ft setPixelSize 15 设置字体大小 QFontMetrics fm QFontMetrics ft 创建字体计算类 double pixW fm width
  • 【基础】Flink -- ProcessFunction

    Flink ProcessFunction 处理函数概述 处理函数 基本处理函数 ProcessFunction 按键分区处理函数 KeyedProcessFunction 定时器与定时服务 基于处理时间的分区处理函数 基于事件时间的分区处
  • 用vscode创建一个c项目_vscode怎样编写c程序

    一 获取C C 扩展 1 打开vscode 2 ctrl shift x打开商店 3 搜索C C 安装 重启vscode 二 安装GCC 1 下载MinGW 2 打开安装程序 安装到D盘 需要创建MinGW文件夹 安装完成之后生成MinGW
  • (手工)【sqli-labs32-38】宽字节注入、报错回显、字符/数字型注入

    目录 一 推荐 二 手工 SQL注入基本步骤 三 Less32 GET Bypass custom filter adding slashes to dangerous chars 3 1 简介 宽字节注入 报错回显 字符型注入 3 2 第
  • JVM简介说明

    转自 JVM简介说明 下文笔者讲述JVM的简介说明 如下所示 JVM简介 JVM的功能是Java应用程序的运行环境 它是Java虚拟机 JVM用于运行java的字节码文件 JVM可以将字节码转换为硬件 操作系统指令 JVM用于同操作系统内层
  • 【HJ31】 单词倒排

    题目描述 对字符串中的所有单词进行倒排 说明 1 构成单词的字符只有26个大写或小写英文字母 2 非构成单词的字符均视为单词间隔符 3 要求倒排后的单词间隔符以一个空格表示 如果原字符串中相邻单词间有多个间隔符时 倒排转换后也只允许出现一个
  • ubuntu 串口助手通信收发数据不一致

    文章目录 问题背景 一 解决方案 1 直接更换硬件 靠这个解决的 2 其他参考 总结 问题背景 主机1 win10笔记本电脑 主机2 ubuntu16 04的宸曜工控机 主机3 ubuntu14 04的一个小盒子 串口助手 cutecom
  • pmd java规则_静态代码扫描 (一)——PMD 自定义规则入门

    阅读该文章前 最好已经对 PMD 有了初步的认识和了解 可参考静态分析工具 PMD 使用说明 准备工作 首先在PMD 官网下载最新版本的文件 目前最新版本是 5 4 1 下载 pmd bin 5 4 1 zip 和 pmd src 5 4