一、简介
1.1、什么是静态代码分析
静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
1.2、静态代码分析工具的优势
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
1.3、Java 静态代码分析理论基础和主要技术
1.4、PMD
PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。
- 与其他分析工具不同的是,PMD通过静态分析获知代码错误。也就是说在不运行Java程序的情况下,报告错误。
- PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题。
-此外,用户还可以自己定义规则。检查Java代码是否符合某些特定的编码规范。常见的类型如下:
① 潜在的bug:空的try/catch/finally/switch语句
② 未使用的代码:未使用的局部变量、参数、私有方法等
③ 可选的代码:String/StringBuffer的滥用
④ 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
⑤ 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
⑥ 循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象
⑦ 资源关闭:Connect,Result,Statement等使用之后确保关闭掉
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作。
二、安装
这里分别以Eclipse和IDEA来演示安装:
2.1、Eclipse安装PMD
Help -> Install New Software,点击Add,添加Repository。Name: PMD,Location:https://dl.bintray.com/pmd/pmd-eclipse-plugin/updates/。点击OK。选择相应的版本插件,继续随后的安装。
然后点击Next,然后一直点击Finish,安装好之后,重启下就行了。
2.2、IDEA安装PMD
settings---->plugins
安装好之后,重启下就行了。
三、使用
3.1、Eclipse中使用
Ecplise的菜单Project->Properties->PMD,在这个窗口选择要应用的规则,并指定相对重要性,为特定项目详细配置PMD
运行PMD。单击项目资源,右键->PMD->Check code。在Violation OverView视图中按问题严重程度列出PMD问题。在Violations outLinew右键show Details可以查看更详细的规则描述以及说明规则的示例代码。
(PMD可检测一个项目、类、单个文件等等)
打开PMD视图
选择DataFlow View显示如下:
在Violation OverView视图中按问题严重程度列出PMD问题。
其中:
● Element:检查的文件;
● Violation/LOC(lineofcode缩写)为:警告个数/源代码行数x1000;
● Violations/Method:警告个数除以方法个数(类中每个方法中的平均错误);
● Project:所在项目
右键点击框体的任意位置显示5个选项按钮对应的功能为:
● Filter Resource:是否展示下列工程
● Filter Priorities:想要展示的警告等级(5个等级,红色为最严重的警告)
● Presentation Type:展示的结构
● clear violations:清除Violations Outline内的信息
● check Code: 重新检查
在Violations OutLinew 右键选型如下:
显示详情(Show details)
忽略问题(Mark as reviewed):可能决定可以安全的忽略问题,在这种情况下,使用Mark as reviewed(标记为已审查)菜单项,这将向代码添加一个注释,以指示PMD在这里忽略此问题。
手工纠正(Remove violation):可以手工纠正问题,并使用Remove violation(删除违例)菜单直接从列表中删除问题。
智能修改:PMD非常智能,在某些情况下,它可以为其提出的问题提供纠正建议,如果是这种情况,可以使用Quick fix(快速修复)菜单类自动纠正。
右键show Details可以查看更详细的规则描述以及说明规则的示例代码。
四、PMD规则
PMD自带的规则如下所示:
自带规则的介绍: (PMD插件分析代码规则(中文).xls)
PMD 自带了很多规则集合,并且分类写入不同的 ruleset 文件,如
Basic 包含每人都必须遵守的代码最佳实践,如EmptyCatchBlock
Braces 关于条件分支的规则,如IfStmtsMustUseBraces
Code Size 关于代码大小的规则,如方法的长度,参数的长度,属性的个数等
Clone 克隆实现的规则,如是否有super.clone()
Controversial 一些有争议的规则,如UnnecessaryConstructor不必要的构造器
Coupling 对象连接有关的规则
Design 可以检查有问题的设计,如SwitchStmtsShouldHaveDefault
Finalizers 使用finalizers时需遵循的规则,如FinalizeOnlyCallsSuperFinalize
Import Statements 和import有关的规则,如DuplicateImports重复importJ2EE 唯一规则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 和命名有关的规则,名称太短或太长,命名的约定等
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 官方文档(http://pmd.sourceforge.net/)
白盒静态自动化测试工具:PMD使用指南(https://www.cnblogs.com/snifferhu/p/3463597.html)
常用 Java 静态代码分析工具的分析与比较(https://www.oschina.net/question/129540_23043)