`
txidol
  • 浏览: 52512 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

静态分析工具PMD使用总结

 
阅读更多

PMD(http://pmd.sourceforge.net/

简介:PMD扫描java源代码,查找潜在的问题,如:

可能的bugs,如空的try/catch/finally/switch声明

死亡的代码,没有使用的本地变量,参数和私有方法

不合标准的代码,如String/StringBuffer用法

过于复杂的表达式,如不必要的if表达式

重复的代码,拷贝、粘贴的代码

PMD的含义,如

Project Mess Detector

Project Monitoring Directives

Project Meets Deadline

Programming Mistake Detector…

用法:可以在命令行下执行,如

pmd c:\Test.java xml rulesets/unusedcode.xml

也可以使用IDE的插件,如Eclipse、IDEA、JBuilder、JCreator等等

这里主要介绍Ant里的调用,

下面是主要的Ant配置信息
<pathid="pmd.path">
<filesetdir="${lib.dir}/pmd-3.8">
<includename="**/*.jar"/>
</fileset>
</path>
<taskdefname="pmd"classname="net.sourceforge.pmd.ant.PMDTask"classpathref="pmd.path"/>
<taskdefname="cpd"classname="net.sourceforge.pmd.cpd.CPDTask"classpathref="pmd.path"/>
<targetname="pmd">
<pmdshortFilenames="true">
<ruleset>rulesets/favorites.xml</ruleset>
<formattertype="html"toFile="d:\foo.html"toConsole="false"/>
<filesetdir="${src.dir}">
<includename="**/*.java"/>
</fileset>
</pmd>
</target>
<targetname="cpd">
<cpdminimumTokenCount="100"outputFile="d:/cpd.txt">
<filesetdir="${src.dir}">
<includename="**/*.java"/>
</fileset>
</cpd>
</target>

自定义规则:

有两个办法来自定义规则,可以编写java类和编写XPath,编写java类的一般步骤是,先确定要查找的代码形式,利用PMD自带的designer.bat工具查看AST(抽象语法树),然后编写规则类(继承net.sourceforge.pmd.AbstractRule),然后编写一个ruleset的XML文件,最后就可以运行PMD进行检查。编写XPath比编写java类要容易些,但也需要掌握AST的含义,利用designer.bat工具可以查看AST,比如//ClassBody [count(//VariableDeclarator[../Type/Name[@Image='Logger']])>1],这个表达式就是查找类的代码里是否声明了多个Logger,然后编写一个ruleset的XML文件,最后运行PMD进行检查。这里是一个ruleset的XML文件的例子。

自定义规则集合:

PMD自带了很多代码规范的规则,还可以自定义规则,我们可以把这些规则整合到一起,按照我们的需求进行代码检查。
<!--使用整个strings规则集-->
<ruleref="rulesets/strings.xml"/>
<!--使用某个规则集里的某个规则-->
<ruleref="rulesets/unusedcode.xml/UnusedLocalVariable"/>
<!--指定某个规则集里的某个规则的优先级-->
<ruleref="rulesets/basic.xml/EmptyCatchBlock"message="Musthandleexceptions">
<priority>2</priority>
</rule>
<!--去除某个规则集里的某个规则-->
<ruleref="rulesets/braces.xml">
<excludename="WhileLoopsMustUseBracesRule"/>
</rule>

最后,我们运行PMD的时候就可以指定这个ruleset文件。

自带规则的介绍:

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

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

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

Optimizations优化性能的一些规则,如LocalVariableCouldBeFinal本地变量如果

只赋值一次,则应该声明为final

Strict Exceptions比较严格的异常处理方针,如AvoidCatchingThrowable

Strings使用String和StringBuffer时应遵守的规则,如StringToString

Sun Security编写安全的代码,有MethodReturnsInternalArray直接返回内部的数组,

更安全的做法是返回一个拷贝和ArrayIsStoredDirectly

Unused Code检查未使用的代码,如UnusedPrivateField未使用的私有属性

Java Server Pages编写jsp的一些方针,如NoLongScripts

Java Server Faces编写jsf的一些方针,有DontNestJsfInJstlIteration,在Jsf

里使用jstl的标签

PMD里面还有一个写好的ruleset文件,在pmd-3.8.jar里面的rulesets文件夹下,名称是favorites.xml,以下是主要部分:

<ruleref="rulesets/basic.xml"/>
<ruleref="rulesets/basic.xml/EmptyCatchBlock"message="Musthandleexceptions">
<priority>2</priority>
</rule>
<ruleref="rulesets/unusedcode.xml"/>
<ruleref="rulesets/braces.xml/WhileLoopsMustUseBraces"/>
<ruleref="rulesets/braces.xml/ForLoopsMustUseBraces"/>
<ruleref="rulesets/design.xml/SimplifyBooleanReturns"/>
<ruleref="rulesets/design.xml/SwitchStmtsShouldHaveDefault"/>
<ruleref="rulesets/strings.xml/StringToString"/>
<ruleref="rulesets/strings.xml/StringInstantiation"/>
<ruleref="rulesets/controversial.xml/UnnecessaryConstructor"/>
<ruleref="rulesets/controversial.xml/NullAssignment"/>
<ruleref="rulesets/controversial.xml/UnusedModifier"/>
<ruleref="rulesets/codesize.xml/CyclomaticComplexity">
<properties><propertyname="reportLevel"value="5"/></properties>
</rule>

其它事项:

1.可以使用JDK1.5的声明@SuppressWarnings(""),禁止PMD的警告。

2.可以使用//NOPMD来标记行或块代码,禁止PMD警告。

3.有两种方法自定义Rule,编写java类和编写XPath。

4.PMD提供了多种IDE的插件来运行PMD。

参考文档:

PMD官方文档(http://pmd.sourceforge.net/

OnJava上一篇文档(http://www.onjava.com/pub/a/onjava/2003/04/09/pmd_rules.html

代码静态分析(http://blog.donews.com/foxgem/archive/2005/04/23/347444.aspx)

分享到:
评论

相关推荐

    静态分析工具PMD使用说明

    质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤其是企业应用软件系统来说,除了软件运行质量、文档质量以外,代码的质量也是非常重要的。软件开发进行到编码阶段的时候,最大的风险就在于如何保证...

    静态java分析工具PMD

    PMD正是这样一种工具,可以直接使用它自带的规则(当然也可以使用自己的规则)对Java源程序进行分析找出程序存在的问题,可以很大程度上的减轻代码检查工作的繁琐,为项目组今后的维护和开发工作起到指导的作用。...

    静态分析工具PMD规则翻译合集

    此文档包含了所有PMD规则的翻译包括解决方法

    代码分析工具使用PMD

    Eclipse代码分析工具使用PMD

    Jenkins中FindBugs、PMD、CheckStyle和Violations静态分析工具安装配置

    Jenkins中FindBugs、PMD、CheckStyle和Violations静态分析工具安装配置详细介绍

    pmd开源分析Java代码的工具

    PMD是一种开源分析Java代码的工具,通过静态分析获知代码错误,该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等等

    pmd-bin-6.19.0-代码重复性检查工具.zip

    pmd-bin 静态代码分析工具 PMD是静态源代码分析器。 它发现常见的编程缺陷,例如未使用的变量,空的catch块,不必要的对象创建等。 它主要涉及Java和Apex,但支持其他六种语言。 PMD具有许多内置检查(以PMD术语,...

    Java代码检查工具 PMD.zip

    Java代码检查工具 PMD ,PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未...

    PMD工具使用说明中文版

    PMD工具使用说明中文版 非常好用的java检查代码的工具

    Java 静态代码分析工具调研和引入

    目前市场上的 Java 静态代码分析工具种类繁多且各有千秋,我们项目调研现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),其中引入并集成了Checkstyle,FindBugs,PMD这三种静态代码工具。

    Java代码检查工具PMD

    PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。  ...

    4 种主流 Java 静态代码分析工具

    java静态代码分析工具包括Checkstyle,FindBugs,PMD,Jtest

    Java程序代码检查工具PMD

    PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。 ...

    Eclipse离线配置PMD插件

    与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误。PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如没有用到的变量、多余的...

    pmd代码检查工具使用

    pmd代码检查工具使用心得,自己从网上收集了一些资料结合自己的使用整理出来的一个文档,希望给大家带来一些帮助,pmd是个不错的代码检查工具

    PMD使用,有兴趣的朋友可以下载

    PMD使用,有兴趣的朋友可以下载PMD使用,有兴趣的朋友可以下载PMD使用,有兴趣的朋友可以下载PMD使用,有兴趣的朋友可以下载PMD使用,有兴趣的朋友可以下载PMD使用,有兴趣的朋友可以下载PMD使用,有兴趣的朋友可以...

    eclipse代码检查工具PMD规则列表

    自己整理的PMD检查的各个规则说明,其中打○的是我自己用的规则,大家自己按实际需要选择吧,有不对的地方请多多指教。

    pmd插件使用文档

    pmd插件使用文档

    PMD集成myeclipse及PMD规则说明

    PMD集成到myeclipse的插件,里面含有pmd工具包,以及集成方式和pmd的规则说明文档。

    java静态检查 pmd

    java静态检查 pmd

Global site tag (gtag.js) - Google Analytics