`
txidol
  • 浏览: 55242 次
  • 性别: 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

    PMD是一款强大的静态代码分析工具,主要用于检查Java源代码中的潜在问题。它通过构建源代码的抽象语法树(AST)来进行分析,帮助开发者发现并修复代码中的不良实践、冗余代码、可能的错误以及不遵循最佳实践的情况。...

    Java代码检查工具 PMD.zip

    这款工具通过对源代码进行静态分析,帮助开发者在代码执行之前找出可能存在的问题,从而减少程序的错误率,提高开发效率。 **PMD的工作原理** PMD通过解析Java源代码,构建抽象语法树(AST)来理解代码的结构。...

    4种静态源代码测试工具的总结(Pc-lint,Pmd,Logiscope,purify)

    PMD是Java语言的静态分析工具,主要关注代码质量问题、潜在的bug和冗余代码。它可以检测出未使用的变量、过深的嵌套循环、复杂度过高的方法等问题,有助于提高代码的可读性和可维护性。PMD可以通过Ant、Maven、...

    java静态检查 pmd

    总结来说,PMD作为Java静态代码分析工具,通过对源代码进行深度检查,帮助开发者发现并修正潜在问题,从而提升代码质量和项目的整体健康度。了解和熟练使用PMD,是成为一名专业且负责任的Java开发者的必备技能之一。...

    pmd插件使用文档

    PMD 是一个强大的静态代码分析工具,用于检测 Java 代码中的潜在问题,它可以帮助开发者遵循最佳实践,提高代码质量和可维护性。通过使用 PMD 插件,开发人员可以自动发现可能的错误、无效的代码、低效的编程习惯...

    软件测试实验教程朱少民版实验报告七

    PMD的主要功能是对Java代码进行静态分析,检测出潜在的问题,如未使用的变量、空的catch块、过度复杂的表达式等。此外,PMD还支持多种其他语言,包括JavaScript、PLSQL、Apache Velocity、XML和XS。通过这种方式,...

    PMD的规则文件

    PMD(英文全称:Poor Man's Dynamic Code Analyzer)是一款开源的静态代码分析工具,主要用于检测Java源代码中可能存在的问题,如潜在的bug、不良的习惯以及可读性差的代码等。在软件开发过程中,使用PMD可以提升...

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

    文章中提到了几种主流的Java静态分析工具:Checkstyle、FindBugs、PMD和Jtest。 #### Checkstyle Checkstyle专注于检查Java代码的格式问题,如缩进、空格、括号使用是否规范等。它确保代码遵循一定的编码规范,有...

    PMD用于根据源代码分析查找不良的编程习惯

    PMD是一款强大的静态代码分析工具,主要用于检测Java源代码中的潜在问题。这款工具通过解析代码,寻找不符合最佳实践、可能导致错误或效率低下的编程习惯。它可以帮助开发者在早期阶段发现并修复代码中的不良习惯,...

    PMD报错原因修改总结.pdf

    PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否...与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说在不运行Java程序的情况下,报告错误。

    PMD总结文档

    PMD(Programmatic Maintenance and Development)是一种静态代码分析工具,旨在提高Java代码的质量和可维护性。下面是PMD的总结文档,涵盖了多个重要的知识点: 1. 避免不必要的布尔比较 在编写布尔表达式时,...

    静态代码检查工具

    PMD是一个多用途的静态分析工具,它可以检测未使用的代码、空的try/catch/finally/switch语句、不必要的对象创建等多种类型的问题。它支持Java、JavaScript、*** Apex、PLSQL、Apache Velocity和XML等多种语言。PMD...

    PMD-Intellij:使用PMD在Intellij中进行静态分析的插件

    **PMD-IntelliJ 插件详解:利用PMD进行Java代码静态分析** PMD是业界广泛应用的一个开源工具,用于静态代码分析和检测。它能够帮助开发者发现潜在的编程错误、坏味道以及不必要的复杂性,从而提升代码质量和可维护...

    pmd-bin-5.4.0.zip

    总结起来,PMD是一个强大的静态代码分析工具,通过“pmd-bin-5.4.0.zip”提供的5.4.0版本,开发者可以便捷地对Java项目进行重复代码检查,从而提高代码质量和可维护性。了解并熟练使用PMD,对于提升团队的开发效率和...

    PMD--java代码检视工具

    PMD是一款强大的开源静态代码分析工具,主要用于Java语言。它的主要功能是对Java源代码进行分析,检测潜在的编程错误、不良习惯和可能的性能问题,从而帮助开发者提高代码质量,降低维护成本。PMD通过定义一系列规则...

    pmd-4.2.5 Java代码检测

    PMD是一款强大的静态代码分析工具,主要用于检测Java源代码中的潜在问题、代码异味(Code Smell)和编程错误。PMD 4.2.5是该工具的一个版本,它旨在帮助开发者提升代码质量,预防可能的运行时错误,并遵循最佳编码...

    idea plugin pmd

    总结来说,Idea Plugin PMD是提高Java代码质量的重要工具,它通过静态分析帮助开发者遵循最佳实践,减少潜在的问题。在IDEA中配置和使用PMD插件,可以有效地提升编程效率和代码质量。如果能访问提供的博客链接,将能...

    pmd-bin-4.2.1.zip

    1. **代码质量检测**:PMD的主要任务是对Java源代码进行静态分析,找出可能存在的问题,如未使用的变量、过长的方法、复杂的条件表达式等,这些都可能导致代码的可读性和维护性下降。 2. **自定义规则**:PMD允许...

    PMD-plugin-myeclipse10

    PMD是一款开源的静态代码分析工具,主要用于Java语言。它能够帮助开发者发现并修复代码中的潜在问题,比如冗余代码、未使用的变量、空的catch块、复杂的表达式等。通过在开发环境中集成PMD插件,程序员可以实时检查...

    net.sourceforge.pmd.eclipse-3.2.6.v200903300643.zip

    PMD是一款开源的静态代码分析工具,用于检测Java源代码中的潜在问题,如未使用的变量、空的catch块、冗余的代码等。PMD插件是这款工具在Eclipse集成开发环境中的扩展,它允许开发者在编写代码的同时,实时检查代码...

Global site tag (gtag.js) - Google Analytics