元经纪 - 元宇宙与人工智能领域相关产品与服务一站式采购平台

400-6166692

PMD:一个可扩展的多语言静态分析器

分类:开源 时间:2023-06-20 04:05 浏览:562
概述
PMD是一个源代码分析器。它会发现常见的编程缺陷,如未使用的变量、空的 catch 块、不必要的对象创建等。它支持多种语言。它可以使用自定义规则进行扩展。它使用 JavaCC 和 Antlr 将源文件解析为抽象语法树 (AST) 并针对它们运行规则以查找违规行为。规则可以用 Java 或使用 XPath 查询编写。
内容

概述

PMD是一个源代码分析器。它会发现常见的编程缺陷,如未使用的变量、空的 catch 块、不必要的对象创建等。它支持多种语言。它可以使用自定义规则进行扩展。它使用 JavaCC 和 Antlr 将源文件解析为抽象语法树 (AST) 并针对它们运行规则以查找违规行为。规则可以用 Java 或使用 XPath 查询编写。

它支持 Java、JavaScript、Salesforce.com Apex 和 Visualforce、Modelica、PLSQL、Apache Velocity、HTML、XML 和 XSL。支持 Scala,但目前没有可用的 Scala 规则。

此外,它还包括CPD,即复制粘贴检测器。CPD 在 C/C++、C#、Dart、Fortran、Gherkin、Go、Groovy、HTML、Java、JavaScript、JSP、Kotlin、Lua、Matlab、Modelica、Objective-C、Perl、PHP、PLSQL、Python、Ruby 中查找重复代码、Salesforce.com Apex 和 Visualforce、Scala、Swift、T-SQL 和 XML。

安装和基本 CLI 使用

[hidecontent type="logged" desc="隐藏内容:登录后可查看"]

更多教程请参阅:网页链接

如何安装 PMD 和 CPD

要求

安装

PMD 以 zip 存档的形式分发,其中包括PMDCPD您可以从github 发布页面下载最新的二进制分发版。 强烈建议(但不是必需)将其包含到您的PATH. 在 Linux 上,您可以通过添加PATH=$PATH:*path_to_pmd*/bin/到您的~/.bashrc/~/.zshrc文件来执行此操作。 在 Windows 上,这是通过以下方式实现的:
  1. “开始”菜单上,右键单击“计算机”
  2. 在上下文菜单中,单击“属性”
  3. “系统”对话框中,单击“高级系统设置”
  4. “系统属性”对话框的“高级”选项卡上,单击“环境变量”
  5. “环境变量”对话框的“系统变量”框中,滚动到“路径”并选择它。
  6. 单击对话框中两个“编辑”按钮中较低的一个。
  7. “编辑系统变量”对话框中,滚动到“变量值”框中字符串的末尾并添加一个分号 (;)。
  8. *path_to_pmd*/bin/在分号后添加适当的值。
  9. 在三个连续的对话框中单击“确定” ,然后关闭“系统”对话框。

通过命令行运行 PMD

PMD 带有几个命令行实用程序,如 CPD、规则设计器或 PMD 本身。 您可以使用位于 PMD 分发目录内的脚本pmdpmd.bat在 Windows 下)运行它们中的任何一个。bin/第一个参数是您要执行的实用程序的名称('check'、'designer'、...),例如 PMD 是通过启动的pmd check。其余参数特定于所使用的实用程序。
运行 PMD 分析(pmd checkpmd.bat check)至少需要一个选项和一个来源列表:
  • -R <path>:您要使用的规则集文件。PMD 使用称为规则集的 xml 配置文件,它指定要在您的源上执行的规则。您还可以通过使用其类别和名称来引用它来运行单个规则(此处有更多详细信息)。例如,您可以使用-R category/java/codestyle.xml/UnnecessaryModifier.
  • <source> …:要分析的来源的路径。这可以是文件名、目录或包含源的 jar 或 zip 文件。或者,您可以使用-dor--dir标志,这是等效的。
此外,大多数情况下都会指定以下选项,即使它们不是必需的:
  • -f <format>: 报告格式。PMD 支持许多开箱即用的报告格式。您可能希望从基本 text格式(默认)或xml格式开始。支持的格式在此处记录
  • --aux-classpath <classpath>:包含已分析 Java 源代码的已编译类文件的类路径(如果有)。正确设置它允许 PMD 使用反射进行更深入的分析。某些规则(例如MissingOverride)要求它正常运行。

示例用法

下面显示了 PMD 的示例运行,格式为text
~ $ pmd check -f text -R rulesets/java/quickstart.xml src/main/java

.../src/main/java/com/me/RuleSet.java:123  These nested if statements could be combined
.../src/main/java/com/me/RuleSet.java:231  Useless parentheses.
.../src/main/java/com/me/RuleSet.java:232  Useless parentheses.
.../src/main/java/com/me/RuleSet.java:357  These nested if statements could be combined
.../src/main/java/com/me/RuleSetWriter.java:66     Avoid empty catch blocks

通过命令行运行 CPD

与 PMD 一样,CPD 在 Unix 上由 启动pmd cpd,在 Windows 上由启动pmd.bat cpd,它需要一个选项和一个源列表:
  • --minimum-tokens <number>:应报告为重复的最小令牌长度。
  • <source> …:要分析的来源的路径。这可以是文件名、目录或包含源的 jar 或 zip 文件。或者,您可以使用-dor--dir标志,这是等效的。

示例用法

下面显示了 CPD 的示例运行,格式为text
~ $ pmd cpd --minimum-tokens 100 /home/me/src

Found a 7 line (110 tokens) duplication in the following files:
Starting at line 579 of /home/me/src/test/java/foo/FooTypeTest.java
Starting at line 586 of /home/me/src/test/java/foo/FooTypeTest.java

assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());
assertEquals(Boolean.TYPE, expressions.get(index++).getType());

[/hidecontent]

 
微信客服
返回顶部