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

article/2025/10/24 12:30:22

这是个人原创的一篇全面介绍PMD静态代码扫描工具的文档,最近部门需要调研静态代码扫描工具以提高代码的质量,经过对比几十款工具,剔除了商用和多年没有更新的,最终锁定的有PMD、SanorQube以及Facebook infer。

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博客:点击打开链接

官方文档:点击打开链接


http://chatgpt.dhexx.cn/article/6nAklHnd.shtml

相关文章

php代码 扫描,PHP代码安全扫描工具(AutoPHPCheck)

PHP代码安全扫描工具(AutoPHPCheck)是一款好用的安全扫描工具,该软件能够帮助用户自动完成检测服务器主要参数、PHP主要参数、PHP安全选项以及服务器性能等功能,当你编辑完一段PHP代码后,就可以将其导入到这个软件里,有兴趣的小伙…

sonarQube(代码扫描工具)安装配置

sonarqube使用介绍[TOC]sonarqube使用介绍 sonarQube使用介绍 本文不讲解 什么是sonarQube,请自行了解 sonarQube安装 sonarQube分为2个 部分 sonarQube 展示扫描结果;sonarScanner 扫描工具; 环境 jdk11;sonarQube的运行需…

Java学习之代码扫描工具的使用方法

有些刚进行Java学习的小伙伴对Java代码扫描工具还不是很了解,不知道该如何使用,下面千锋重庆的小编就来告诉大家使用方法。 1.插件的安装 由于使用的mac所有以Mac下idea插件安装流程为例,首先进入idea的preferences,点击plugin选…

静态代码扫描工具(多种)简要入门介绍-SonarQube社区版-免费、TscanCode工具、PMD工具、flake8工具

SonarQube社区版-免费 适用语言:Java, C#, JavaScript, TypeScript, CloudFormation, Terraform, Kotlin, Ruby, Go, Scala, Flex, Python, PHP, HTML, CSS, XML and VB.NET 下载安装 由于实际操作中,JDK版本的限制,8及以下,进入…

《Python代码审计》(1)一款超好用的代码扫描工具

1.前言 从本文开始,我将开始介绍Python源代码审计,代码审计是检查源代码中的安全缺陷,检查源代码是否存在安全隐患,或者编码不规范的地方。通常使用自动化工具或者人工审查的方式,自动化工具效率高,但是误…

java 静态扫描_静态代码扫描工具 – (八)- 扫描Java项目

静态代码扫描工具 – (八)- 扫描Java项目 1、准备好Java项目代码 只要是java语言实现的项目均可。 比如,自动化测试的代码,测试平台等均可以。 本次案例,使用java语言实现的测试平台来做为扫描对象。 2、了解java项目代码的结构。 为什么要了…

Android和iOS静态代码扫描工具

Android 名称 来源 功能特点 检查SQL注入 检查NullPointException 支持IDE情况 Android Lint Android SDK 针对Android,检查范围广 否 是 Eclipse、Android Studio FindBugs 国外 针对Java程序,失去对Android特性的检查 否 是 Eclipse、…

[C++]TscanCode代码扫描工具

TscanCode介绍 TscanCode 是腾讯研发的静态代码扫描工具,最早的版本是基于 cppcheck 二次开发。之后又重新自研,不仅支持 C,还支持 C#,Lua 语言,在发掘 C 空指针、越界、未初始化、C#空引用、Lua变量未初始化等比较有…

源代码扫描工具

1. DMSCA-企业级静态源代码扫描分析服务平台 系统架构 客户可以通过Internet或者局域网络 从浏览器、Eclipse、Visual Studio 、命令行 、甚至 Web 服务访问DMSCA 服务平台,上传扫描代码,选择扫描策略,自动化扫描, 并利用平台可视…

Fortify代码扫描工具

一、Fortify介绍 Fortify是一款强大的静态代码扫描分析工具,其发现代码漏洞缺陷的能力十分强悍,主要是将代码经过编译,依托于其强大的内置规则库来发现漏洞的。其次fortify SCA团队在开发此商业工具时,也提供了自定义规则的…

四款优秀的源代码扫描工具简介

转载于:https://www.cnblogs.com/xiaominggong/archive/2019/05/06/10821005.html 一、DMSCA-企业级静态源代码扫描分析服务平台 端玛企业级静态源代码扫描分析服务平台(英文简称:DMSCA)是一个独特的源代码安全漏洞、质量缺陷和逻…

SonarQube代码扫描工具

SonarQube(社区版) SonarQube是一个用于代码质量管理的开放平台,通过插件机制,SonarQube可以集成不同的测试工具,代码分析工具,以及持续集成工具,例如Hudson/Jenkins等。 sonarqube的七个维度检测代码质量: 复杂度分布:代码复杂度过高将难以理解重复代码:程序中包含…

java代码扫描工具比较_代码扫描工具的选型和Sonar最佳实践

目标 在编码阶段发现NNE空指针异常、IO流未正确关闭等致命性bug,杜绝此类“零容忍”线上异常的发生。 技术选型 关于代码扫描工具,比较主流的有Sonar、FindBugs、Alibaba Java Coding Guidelines、CheckStyle。 Alibaba Java Coding Guidelines最大的优点是全中文的提示,对国…

静态代码扫描工具汇总

一、概述 在软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。传统的代码评审、同事复审,通过人工方式来检查缺陷仍然是一件耗时耗力的事情。而静态代码扫描工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时…

用户行为序列推荐模型

导读:今天我们谈谈用户行为序列上的推荐模型。首先我们对序列推荐问题做一个定义和描述,然后主要讲述可以用在序列推荐任务中的 NN 模型,最后给出一点个人看法以及文中相关的参考文献供参阅。 用户行为大多数情况下都是存在时间上的先后关系…

用户兴趣模型分类以及推荐系统技术调研

用户兴趣模型分类 根据用户之前在相关网站的行为数据记录分析出用户的兴趣和偏好,然后根据不同用户兴趣和偏好不同为其推荐不同的内容,这种新的信息获取方式被称为个性化推荐技术。 个性化新闻推荐系统中常用的几种用户兴趣建模方法: &…

用户生命周期模型

本文转载自: https://blog.csdn.net/l18930738887/article/details/50818878 一、为什么要定义用户生命周期? 用户生命周期是为了定位每个用户在哪个阶段,对于某个阶段的用户进行不同的营销策略。比如初期用户:还没有养成使用习…

Django重写User模型修改明文密码加密方法

由于继承Django的User列表会导致创建新用户的密码为明文,导致无法正常登陆,因此需要修改adminx中的部分配置实现原始的用户密码记录功能。 从这样的界面进入注册用户的密码就是加密的密码效果了,否则是显示明文密码非加密状态。 文章目录 实现步骤实现步骤 需要在项目的m…

【模型理解】KANO模型

前言 在大量的需求需要进行迭代时,由于时间、人力、财力等相关因素干扰,无法在有限的时间内容对所有的需求进行满足,此时需要我们对需求进行优先级的排列。最大化的合理的提高有限资源的使用。 在常见的产品优先级区分的方式有时间四象限模…

软件工程的十大模型

1.软件生命周期模型 软件生命周期由软件定义、软件开发与运维(也称软件维护)3个时期组成,每个时期又进一步划分成若干个阶段。 问题定义:“要解决的问题是什么?”通过对客户的访问调查,系统分析员扼要地写出…