PMD-源代码分析器介绍

举报
gentle_zhou 发表于 2022/06/28 16:12:22 2022/06/28
【摘要】 PMD其实是静态代码检查插件工具用到的一款源代码分析器(source code analyzer)

在代码检查的时候,经常会看到某个缺陷基于的规范来自于PMD。看到的频率就高了,好奇心就来了:PMD是啥?为啥出现的频率这么高?

于是就去网上搜了下,发现PMD代表一堆奇奇怪怪的意思。可以代表Programming Mistake Detector(静态代码检查工具),Program Managment Document(项目管理文档),Physical Media Dependent(物理媒体决定),Pretty Much Done(几乎要完成了),Project Meets Deadline(项目到截止日期了)等等,除了第一个和我们代码检查有关系之外,另外大家就当了解一下就可以啦。

但其实我们这里要讲的PMD其实是静态代码检查插件工具用到的一款源代码分析器(source code analyzer)。它可以在不运行项目代码的情况下检测代码中常见的编程缺陷(如未使用的变量/空的捕获块,不必要的对象创建等),方式是与事先已制定好的规则进行对比(规则可以自定义进行扩展,可以用用Java编写,也可以使用XPath查询),比较出代码中不符合规则的部分。

此外,PMD还包括CPD(copy-paste-detector),一个复制黏贴检测器。它可以在C/C++, C#, Dart, Fortran, Go, Groovy, Java, JavaScript, JSP, Kotlin, Lua, Matlab, Modelica, Objective-C, Perl, PHP, PLSQL, Python, Ruby, Salesforce.com Apex, Scala, Swift, Visualforce和XML语言文件中发现重复部分。

PMD支持多种语言:Java, JavaScript, Salesforce.com的Apex和Visualforce, Modelica, PLSQL, Apache Velocity, XML, XSL, Scala。

PMD如何检测出缺陷

PMD的工作原理是怎样的呢?

它使用JavaCC(一个开源的语法分析器生成器和词法分析器生成器)和Antlr(基于LL算法实现的语法解析器生成器),将源文件解析为抽象语法树;然后根据预先制定的规则针对树里各个相应节点,分析其属性或结构,从而找出相应违反规定的部分。

抽象语法树,即AST-Abstract Syntax Tree,会将代码结构通过“树”的形式展现出来,每部分代码(例如变量声明、if-else 语句、变量赋值、类、数据库查询等)都会成为树的各个节点。

举个例子:

public class ClassA {
	public  static  void MethodB() {
     if (false) {
     	String varStr = "hello HW PaaS!";
     }
  }
}

将上述代码转化为语法树之后,其结构大致类似于UserClass “ClassA” — Method “MethodB” — BlockStatment — IfElseBlockStatment — VariableDeclaraion “varStr”;可以看出,这棵树的根节点就是类的声明,子节点就是类中的函数,再往下就是if语句,变量等元素。

如何使用PMD

下载二进制压缩包

我们从已发行版本链接里下载最新的二进制压缩包,然后在本地解压提取出来:
image.png

解压完成之后,执行命令bin/run.sh pmd 或则 bin\pmd.bat。然后如下图片里展示的命令行那样,我们可以针对某个具体的代码文件进行检查,如下图就展示了PMD检测到文件里有1个违反规则的地方:“for循环,可以被for-each循环替代”:
image.png

参考资料

  1. https://github.com/pmd/pmd
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。