编码规范(三)----静态分析工具PMD

2024-06-17 05:32

本文主要是介绍编码规范(三)----静态分析工具PMD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介


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)

这篇关于编码规范(三)----静态分析工具PMD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068595

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串