您的位置:首页 > 产品设计 > 产品经理

代码静态解析PMD

2016-06-25 19:55 561 查看


在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明

Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:
– 可能的bug——空的try/catch/finally/switch块。
– 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
– 空的if/while语句。
– 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
– 可优化的代码:浪费性能的String/StringBuffer的使用。

下载pmd , 配置CLASSPATH等内容

requirement

Java JRE 1.6 or higher

Winzip or the free 7-zip

将压缩包解压在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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: