pmd静态代码分析

在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明
Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:
– 可能的bug——空的try/catch/finally/switch块。
– 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
– 空的if/while语句。
– 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
– 可优化的代码:浪费性能的String/StringBuffer的使用。
下载pmd , 配置CLASSPATH等内容
requirement
将压缩包解压在C盘
cmd 后然后输入以下内容:

-dir 指定目录, -f 指定生成的结果的格式 -R 使用何种规则进行检测
rulesets/java/*.xml 具体地址在pmd-bin-5.4.2\bin

规则如下:
PMD 包含 16 个规则集,涵盖了 Java 的各种常见问题,其中一些规则要比其他规则更有争议:
- 基本(rulesets/basic.xml)—— 规则的一个基本合集,可能大多数开发人员都不认同它:
catch块不该为空,无论何时重写equals(),都要重写hashCode(),等等。 - 命名(rulesets/naming.xml)—— 对标准 Java 命令规范的测试:变量名称不应太短;方法名称不应过长;类名称应当以小写字母开头;方法和字段名应当以小写字母开头,等等。
- 未使用的代码(rulesets/unusedcode.xml)—— 查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法,等等。
- 设计(rulesets/design.xml)—— 检查各种设计良好的原则,例如:
switch语句应当有default块,应当避免深度嵌套的if块,不应当给参数重新赋值,不应该对 double 值进行相等比较。 - 导入语句(rulesets/imports.xml)—— 检查 import 语句的问题,比如同一个类被导入两次或者被导入
java.lang的类中。 - JUnit 测试(rulesets/junit.xml)—— 查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及
suite()方法是不是 static 和 public。 - 字符串(rulesets/string.xml)—— 找出处理字符串时遇到的常见问题,例如重复的字符串标量,调用
String构造函数,对String变量调用toString()方法。 - 括号(rulesets/braces.xml)—— 检查
for、if、while和else语句是否使用了括号。 - 代码尺寸(rulesets/codesize.xml)—— 测试过长的方法、有太多方法的类以及重构方面的类似问题。
- Javabean(rulesets/javabeans.xml)—— 查看 JavaBean 组件是否违反 JavaBean 编码规范,比如没有序列化的 bean 类。
- 终结函数(finalizer)—— 因为在 Java 语言中,
finalize()方法不是那么普遍(我上次编写这个代码也经是好多年前的事了),所以它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找finalize()方法的各种问题,例如空的终结函数,调用其他方法的finalize()方法,对finalize()的显式调用,等等。 - 克隆(rulesets/clone.xml)—— 用于
clone()方法的新规则。凡是重写clone()方法的类都必须实现Cloneable,clone()方法应该调用super.clone(),而clone()方法应该声明抛出CloneNotSupportedException异常,即使实际上没有抛出异常,也要如此。 - 耦合(rulesets/coupling.xml)—— 查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。
- 严格的异常(rulesets/strictexception.xml)—— 针对异常的测试:不应该声明该方法而抛出
java.lang.Exception异常,不应当将异常用于流控制,不应该捕获Throwable,等等。 - 有争议的(rulesets/controversial.xml)—— PMD 的有些规则是有能力的 Java 程序员可以接受的。但还是有一些争议。这个规则集包含一些更有问题的检验,其中包括把 null 赋值给变量、方法中有多个返回点,以及从
sun包导入等。 - 日志(rulesets/logging-java.xml)—— 查找
java.util.logging.Logger的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。
如果为了一次性将所需要的规则都进行检测,可以进行如下的操作
1、将现有的规则使用逗号进行隔离, rulesets/java/strings.xml,rulesets/java/xx.xml等
2、定义自己的规则集
<?xml version="1.0"?>
<ruleset name="customruleset">
<description>
Sample ruleset for developerWorks article
</description>
<rule ref="rulesets/design.xml"/>
<rule ref="rulesets/naming.xml"/>
<rule ref="rulesets/basic.xml"/>
</ruleset>
更细致的规则集:
<?xml version="1.0"?>
<ruleset name="specific rules">
<description>
Sample ruleset for developerWorks article
</description>
<rule ref="rulesets/design.xml/AvoidReassigningParametersRule"/>
<rule ref=
"rulesets/design.xml/ConstructorCallsOverridableMethod"/>
<rule ref="rulesets/design.xml/FinalFieldCouldBeStatic"/>
<rule ref="rulesets/design.xml/DefaultLabelNotLastInSwitchStmt"/>
<rule ref="rulesets/naming.xml/LongVariable"/>
<rule ref="rulesets/naming.xml/ShortMethodName"/>
<rule ref="rulesets/naming.xml/VariableNamingConventions"/>
<rule ref="rulesets/naming.xml/MethodNamingConventions"/>
<rule ref="rulesets/naming.xml/ClassNamingConventions"/>
<rule ref="rulesets/basic.xml/EmptyCatchBlock"/>
<rule ref="rulesets/basic.xml/EmptyFinallyBlock"/>
</ruleset>
排除具体某个规则:
<?xml version="1.0"?>
<ruleset name="dW rules">
<description>
Sample ruleset for developerWorks article
</description>
<rule ref="rulesets/design.xml">
<exclude name="SwitchStmtsShouldHaveDefault"/>
</rule>
</ruleset>

可以使用-r参数来讲检测的结果导出到某个地方
在线文档:https://pmd.github.io/pmd-5.4.2/index.html
我们自己建立了一个自己的facebankrules.xml文件,只是简单的包含一部分我们认为重要的规则.
修改rulesets.properties,并将facebankrules.xml文件加入到压缩包中

facebank自己的规则如下;
<?xml version="1.0"?>
<ruleset name="facebankrules">
<description>
Sample ruleset for facebank developers
</description>
<rule ref="rulesets/java/unusedcode.xml"/>
<rule ref="rulesets/java/design.xml"/>
<rule ref="rulesets/java/imports.xml"/>
<rule ref="rulesets/java/strings.xml"/>
<rule ref="rulesets/java/braces.xml"/>
<rule ref="rulesets/java/codesize.xml"/>
<rule ref="rulesets/java/javabeans.xml"/>
<rule ref="rulesets/java/coupling.xml"/>
<rule ref="rulesets/java/strictexception.xml"/>
<rule ref="rulesets/java/logging-java.xml"/>
<rule ref="rulesets/java/sunsecure.xml"/>
</ruleset>
操作规则:https://pmd.github.io/pmd-5.5.0/usage/running.html
linux下执行命令如下:
pmd静态代码分析的更多相关文章
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- [转载] 常用 Java 静态代码分析工具的分析与比较
转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...
- 【转载】常用 Java 静态代码分析工具的分析与比较
摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...
- 常用Java静态代码分析工具的分析与比较
给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...
- Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)
目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...
- Android 静态代码分析工具
简评: 作者在文中提到的三个静态代码分析工具不是互相替代的关系,各有各的侧重点,如果有需要完全可以同时使用. 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程 ...
- C++静态代码分析PreFast
1历史 Prefast是微软研究院提出的静态代码分析工具.主要目的是通过分析代码的数据和控制信息来检测程序中的缺陷.需要强调的是,Prefast检测的缺项不仅仅是安全缺陷,但是安全缺陷类型是其检测的最 ...
- C++静态代码分析工具推荐——PVS-Studio
长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...
- 来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.
随机推荐
- git命令分类图
- JavaScript -Array.form方法
Array.from方法可以把一个类数组或者课遍历对象转换为一个正真的数组 语法 Array.from(arrayLike[, mapFn[, thisArg]]) 参数 arrayLike 想要转换 ...
- 安装完成后在命令行运行bash时报错0x80070057
在命令运行bash 提示如下: 解决方法,不启用旧版本控制台: 右键命令提示栏 打开属性,把勾选去掉如下图红色边框标识: 然后重启,就可以使用,也包括可以打开Bash on Unbuntu on Wi ...
- javaWeb应用打包
在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)
由于iis的自动回收机制,不适用于ASP.NET程序 代码: using System; using System.Collections.Concurrent; using System.Confi ...
- VS2010 VS2012 VS2013 VS2015启动调试时老是提示正在下载公共符号
VS2010 VS2012 VS2013 VS2015启动调试时老是提示正在下载公共符号,下载一些.dll文件,点取消后也能继续调试,但特别慢.解决方法:工具-选项,或者调试-选项和设置,将调试下的& ...
- C#开发微信门户及应用(16)-微信企业号的配置和使用
在本系列随笔的前面,主要就是介绍微信公众号的门户应用开发,最近把整个微信框架进行了扩展补充,增加了最新的企业号的API封装和开发,后续主要介绍如何利用C#进行微信企业号的开发工作,本篇作为微信企业号的 ...
- java访问修饰符
了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...
- Delphi_02_Delphi程序的结构
一.工程文件 program MultiUnit; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; begin //引用unit1中的变 ...
- Python09作业思路及源码:高级FTP服务器开发(仅供参考)
高级FTP服务器开发 一,作业要求 高级FTP服务器开发 用户加密认证(完成) 多用户同时登陆(完成) 每个用户有不同家目录且只能访问自己的家目录(完成) 对用户进行磁盘配额,不同用户配额可不同(完成 ...