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

2023-11-16

一、简介


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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编码规范(三)----静态分析工具PMD 的相关文章

  • spring boot工程创建(idea无法联网)

    1 进入spring官网Spring Home 2 点击spring boot 3 翻到最下边 点击此处 或者直接进入网址Spring Initializr 4 设定项目基本内容 5 选择对应依赖 6 删除依赖 7 创建项目 8 将项目压缩
  • 自监督学习-MoCo-论文笔记

    论文 Momentum Contrast for Unsupervised Visual Representation Learning CVPR 2020 最佳论文提名 用动量对比学习的方法做无监督的表征学习任务 动量的理解即是指数移动平
  • 初学者写一个程序(一)(PyCharm配置Python解释器)

    5 PyCharm配置Python解释器 1 首先安装 PyCharm 完成之后 打开它会显示如下所示的界面在file中也有settings 点击后一样的操作 图六 在此界面中 可以手动给 PyCharm 设置 Python 解释器 点击图
  • 指数平滑法(Exponential Smoothing,ES)

    目录 1 指数平滑 2 一次指数平滑预测 又叫简单指数平滑 simple exponential smoothing SES 2 1 定义 2 2 例题 3 二次指数平滑法 Holt s linear trend method 3 1 定义
  • torch.nn.modules.module.ModuleAttributeError: ‘DataParallel‘ object has no attribute ‘step‘

    错误位置定点 解决方法
  • react学习—属性默认值和类型验证

    属性默认值和类型验证 一 属性默认值 1 函数组件属性默认值 2 类组件默认属性值 二 属性类型验证 1 常见值类型 2 是否必传isRequired 3 其它类型验证 4 自定义验证 一 属性默认值 通过一个静态属性defaultProp
  • 基础算法matlab

    常用算法 knn knn clc close all clear training mvnrnd 2 2 eye 2 50 mvnrnd 2 2 2 eye 2 50 mvnrnd 2 2 2 eye 2 50 group ones 50
  • Comparable和Comparator的区别以及Lambda表达式实现

    Comparable和Comparator的区别 1 comparable里面的ComparaTo 是TreeSet和TreeMap里面add 与put 方法里面调用对象的ComparaTo 通过返回值 来确定它 是否存在or顺序 他是内置
  • 计算机二级证书免费发到学校,计算机二级证书去哪里领取

    随着计算机等级考试成为了当代大学生必考的考试之一 越来越多的同学都加入到考试大军 通过了计算机二级考试 证书如何领取呢 下面是小编整理的详细内容 一起来看看吧 计算机二级证书领取方法 1 一般情况下是考试结束后50个工作日左右出成绩及出证
  • echarts 中 symbol 自定义图片

    首先我使用的技术框架的VUE 当然该方法在其他框架也是适用的 这点大家注意一下 在官方文档里面 修改标记的图形 symbol 的方法有三种 一 ECharts 提供的标记类型有 circle rect roundRect triangle
  • .NET C#基础(5):结构体 - 高性能代码的基石

    0 文章目的 本文面向有一定 NET C 基础知识的学习者 介绍C 中结构体定义 使用以及特点 1 阅读基础 了解C 基本语法 了解 NET中的栈与托管堆 2 值类型 2 1 NET的两大类型 在 NET中 所有类型都是object类型的子
  • Excel行高、列宽怎么调整?

    在日常工作中 经常会需要用到Excel表格 如果打开的Excel表格行高列宽不是我们想要的 要怎么调节到合适的大小呢 方法一 打开Excel表格 按 Ctrl A 快捷键 选中全部表格 或者点击表格左上角 行号和列标交汇处的灰色小三角 也可

随机推荐

  • CEPH PG incomplete状态修复

    某运营商的Kubernetes项目物理机停机维护 重启后Kubernetes部分pod无法挂载PVC 请求超时 该Kubernetes集群的后端存储使用ceph rbd块存储 检查ceph集群状态异常 root ceph node01 ce
  • Nacos

    一 Nacos Spring Cloud Alibaba https spring io projects spring cloud alibaba Nacos 官网 https nacos io zh cn docs what is na
  • openGL library下载地址

    GLUT下载页面 http www opengl org resources libraries glut glut downloads php GLUT for Win32下载页面 http www xmission com nate g
  • linux系统虚拟机安装centos7

    一 安装 第一步 下载安装VMware Fusion Mac版本下载后双击安装 这里不做过程记录 第二步 下载CentOS 7安装包 CentOS 7 x86 64 DVD 1810 iso 本文不提供下载地址 第三步 在VMware Fu
  • Vue中使用render 封装el-table解决多级表头自定义模板

    vue中多数情况下使用template封装组件逻辑清晰结构简单 但是在某些情况下 比如非常简单的组件 vue render简单解析或者template无法解决某些场景下 使用完全javascirpt能力就显得尤为重要 文章目录 使用rend
  • VB.Net常用的正则表达式(实例)

    d 非负整数 正整数 0 0 9 1 9 0 9 正整数 d 0 非正整数 负整数 0 0 9 1 9 0 9 负整数 d 整数 d d 非负浮点数 正浮点数 0 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1
  • 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数---百度笔试题

    题目 给定一个存放整数的数组 重新排列数组使得数组左边为奇数 右边为偶数 要求 空间复杂度O 1 时间复杂度为O n 我自己写了一下 之前写的那个不对 现在重写了 时间复杂度达到O n void swap int a int i int j
  • python数据可视化-折线图

    可通过ab173 com查看json数据 导入json import json 处理数据 美国为例 f us open D 桌面 折线图数据 美国 txt r encoding UTF 8 us data f us read 美国的全部内容
  • VMware17虚拟机安装及Linux系统搭建(详细版)

    作者简介 大家好 我是小杨 个人主页 小杨 的csdn博客 希望大家多多支持 一起进步呀 前言 VMware是一个虚拟PC的软件 可以在现有的操作系统上虚拟出一个新的硬件环境 相当于模拟出一台新的PC 进行计算机的管理 软件安装 文件的使用
  • 这十个步骤让你的 App 避规ios 4.3被拒问题

    4 3 垃圾应用 请不要为同一个 App 创建多个套装 ID 如果您的 App 针对特定位置 运动队 大学等存在不同版本 请考虑提交单个 App 并提供 App 内购买以提供差异功能 同时 请避免继续在已有大量类似 App 的类别下进行开发
  • kubectl应用

    文章目录 kubectl用法概述 kubectl输出格式 kubectl操作示例 kubectl用法概述 kubectl命令语法 kubectl command TYPE NAME flags 其中 command TYPE NAME fl
  • 如何计算内存大小

    对电子产品 存储介质厂家来说 是按进率1000来计量的 即1000B 1KB 1000KB 1MB 1000MB 1GB 也就是为什么硬盘分区后 会造成缩水 比如80G硬盘实际等于76G 的原因 因为系统是按1024进率来进行分区的 注 我
  • 多文件编程

    文章目录 什么是多文件编程 lt gt 与 多文件编程方法 变量重复定义与头文件重复包含 变量重复定义 头文件重复包含 为什么要避免重复包含 如何解决 1 ifndef 2 pragma once 小总结 什么是多文件编程 多文件编程 指的
  • vite postcss

    PostCSS PostCSS是一款使用JavaScript插件对CSS实现转换的工具 PostCSS拥有非常强大的插件 典型的比如autoprefixer cssnext css modules等 PostCSS插件的处理方式类似CSS预
  • CSS:基本选择器中的ID选择器和class选择器的区别

    ID选择器 通过标签的id名称来选择标签 id 类选择器 class选择器 选择一个类别 className 区别 1 ID 选择器的是以井号 开头来定义的 类 选择器是以点 来定义的 2 ID 选择器在 HTML 中是可以通过 id 属性
  • 2_Nginx 语法

    文章目录 一些说明 配置静态资源服务器 常用指令 一些说明 指令 指令块 指令以分号结尾 一条指令可以有一个或多个参数 参数之间以空格分隔 例如 server name 指令块可以有名字或者没有名字 include 允许组合多个配置文件 以
  • 面经(一)广州保伦电子有限公司校招宣讲面经

    前言 本章主要讲述我曾参加广州保伦有限公司的学校宣讲并笔试的经历 一 经历概述 宣讲前 在得知该公司会来我们学校进行宣讲时 我看到有招聘Java开发职位 就马上决定参加该公司的宣讲 因为我们学校是最后一次宣讲的地方 自己心里也知道人肯定是招
  • Design Compiler (七)——环境、设计规则和面积约束

    本文如果有错 欢迎留言更正 此外 转载请标明出处 http www cnblogs com IClearner 作者 IC learner 本文的主要内容是讲解 约束针对的是逻辑综合下的约束 而实战部分则是在DC的拓扑模式下进行 环境属性的
  • image not loaded  try to open it externally to fix format problem

    image not loaded try to open it externally to fix format problem 图片没有加载 请从外部打开图片以解决格式问题 由于项目是直接复制过来的 图片从外部打开显示为空 直接全部替换重
  • 编码规范(三)----静态分析工具PMD

    一 简介 1 1 什么是静态代码分析 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算 可能出现的空指针引用