java静态分析_PMD-Java代码静态分析工具使用

  • Post author:
  • Post category:java


如今,使用代码分析工具来代替人工进行代码审查,已经是大势所趋了。用于Java代码检测的工具中,不乏许许多多的佼佼者,其中PMD就是其中一款。PMD既可以独立运行,也可以以命令行的形式运行,还可以作为插件在IDE中运行,本文将基于在Android Studio中的使用来介绍PMD的基本使用。

一、PMD简介

对于PMD名称含义,有个有趣的现象,PMD不存在一个准确的名称,在官网上你可以发现很有有趣的名称 ,比如:Pretty Much Done,Project Meets Deadline等。PMD是一款程序代码检查工具(可以支持多种语言,以Java为例),通过静态分析Java源文件来获知代码错误,也就是说在不运行不编译Java程序的情况下直接扫描Java源文件,报告错误 。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。它附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,比如:

可能的 Bugs:检查潜在代码错误,如空 try/catch/finally/switch 语句

未使用代码(Dead code):检查未使用的变量,参数,方法

复杂的表达式:检查不必要的 if 语句,可被 while 替代的 for 循环

重复的代码:检查重复的代码

循环体创建新对象:检查在循环体内实例化新对象

资源关闭:检查 Connect,Result,Statement 等资源使用之后是否被关闭掉

用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread对象的操作。

PMD支持的编辑器包括:JDeveloper、Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA(Android Studio是基于此编辑器)、TextPad、Maven、Ant、Gel、JCreator和Emacs。

二、PMD的安装

通过File > Settings > Plugins > Browse repositories 搜索 “PMD”,找到“PMDPlugin”这一项,按照提示进行安装,然后重启即可。

三、使用PMD检测代码

1、启动PMD检测功能

(1)从Tools菜单中启动

通过Tools > Run PMD可以看到如下的界面。从运行结果来看,如果通过该方式启动,扫描的范围就是整个个项目中的文件了。

ae1183dd7096947694698700bf76346b.png

Pre Defined:表示预定义的规则,也就是该插件自带的检测规则。后面展开的列表中列处了所有的规则列表,想扫描哪一种类型的问题,点击即可。其中“All”表示使用所有的规则。

Custom Rules:自定的检测规则。该插件允许用户根据自己的需要自定义检查规则,默认这里是不可点击的,需要在设置中导入自定义规则文件后方可选择。

(2)从右键菜单中启动

在文件或者编辑器中点击右键,也可以看到“Run PMD”选项,和从“Tools”菜单中启动一样,这里不赘述了。通过该方式启动, 检测范围取决于鼠标或光标当前所选中的区域。

2、运行结果

运行后会出现如下面板:

f724d825fe4ff9c9f3171c45fb2c7422.png

左边工具栏,鼠标停留在上面会提示其功能,比较简单就不啰嗦了。右边显示了检测结果,这里显示的结果类别取决于我们运行的时候在“Pre Defined”中选择的规则类型,因为前面选择的“All”,所以所有的规则都显示了。当点击具体某一问题项时,会跳转到对应的源码中。

四、配置检测规则

通过File > Settings > Other Settings > PMD可以打开检测规则的设置界面:

9db508494dc8e221bb6d5348497e9998.png

在“RuleSets(规则设置)”界面可以管理自定义的检测规则。因为在实际工作中,可能有些团队需要根据实际情况自定义检测规则,就可以通过这里导入。如果要使用它,需要在启动PMD进行检测时选择该自定义规则。

点击“Options”选项卡,在其中可以配置一些检测规则选项

1e54d6944a51e7b9ce33ec094b30a85f.png

其中重点需要留意的是“Skip TestSource”这一项,因为在项目中有不少Android Studio自动生成的测试代码,如下所示,选择上述选项后可以将其过滤掉。

809a0e5c22ae9088e9782ec223d75c45.png

五、PMD的高级使用

本文主要介绍PMD的基本使用,同时限于笔者的水平有限,这里仅简单介绍一下它的高级使用。

PMD功能非常强大,仅仅是针对Java的检测就附带了让人众多的规则,这里提供一份《PMD插件分析代码规则(中文).xls》文档,有兴趣的可以下载深入了解:

提取码:90f4

对于自定义规则,这里提供一个自定义模板(pmd_custom_rule.xml,可以直接导入使用),可以通过这个模板学习一下PMD的规则定义:

xmlns=”http://pmd.sf.net/ruleset/1.0.0″

xsi:noNamespaceSchemaLocation=”http://pmd.sf.net/ruleset_xml_schema.xsd”

xsi:schemaLocation=”http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd”>

Custom ruleset for ribot Android application

.*/R.java

.*/gen/.*

友情链接:

java代码静态分析工具

需求:有些基础类型的遍历,值希望它被赋予指定的几个值,赋予其他值能够别编译器(IDEA/eclipse)提醒 Android studu结合自己的插件,引入



版权声明:本文为weixin_39963534原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。