idea p3c 自定义_扩展阿里p3c实现自定义代码规范检查

前段时间fastjson报出了漏洞,只要打开setAutoType特性就会存在风险,自己测试环境的一个项目被揪出来了-_-!。虽然改动很小,但就是觉得憋屈。fastjson还是挺好的,想着禁用的话太可惜,用的话又要注意安全,就想着找款工具提示下在用fastjson的时候不要打开这个特性。刚好阿里开源了p3c(https://github.com/alibaba/p3c),一款代码规范的检查工具,有对应的ide插件,能在编码过程中对设置的规则进行提示,便打算对它进行拓展,增加对fastjson检查是否打开setAutoType特性的检查。

p3c主要包括3部分:

PMD实现(p3c-pmd):使用PMDhttps://pmd.github.io/来实现代码规范检查

Intellij IDEA插件

Eclipse插件

《阿里巴巴Java开发手册》中的大部分规则都是在p3c-pmd模块中实现的,该部分也是这节研究的主要部分。

1. PMD

p3c使用了PMD。PMD是一款静态代码扫描工具,该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。PMD使用JavaCC生成解析器来解析源代码并生成AST(抽象语法树),通过对AST的检查可以直接从源代码文本层面来对代码进行检查,在PMD内部称为规则。即是否符合规则指的是,穷举源码各种可能的写法,然后在AST上检查是否出现。而规则的实现,重点便在对AST的处理上。

1.1. AST

关于AST的介绍网上有很多,可以直接搜索,这里重要提两点:

AST是源代码的抽象语法结构的树状表示

抽象语法树并不依赖于原语言的语法,也就是说同语法分析阶段所采用的上下文无关

PMD使用JavaCC来生成AST。关于JavaCC也可以在网上查看相关资料,这里不多介绍,只要知道JavaCC是一个词法分析生成器和语法分析生成器便行。

1.2. 自定义规则

PMD官方文档介绍了自定义规则的实现步骤,过程比较清晰,这里不赘述,只介绍下本文需要设计的步骤。

1.2.1. 定义规则集

PMD的规则需要配置在XML文件中

新建如下的空文件表示规则集

xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">

My custom rules

在上面的ruleset 标签中引用自定义规则

配置规则集

1.2.2. 配置规则

可以在 rule 标签中对某一规则进行配置

配置提示消息和告警级别

message="message to show" >

5

告警优先级分为1-5个level,1最高,5最低

配置运行参数

可以通过 properties 和 propertie对类属性赋值

1.2.3. 编写规则

规则的编写比较简单,PMD已经给我们做好了配套的开发框架和工具,只要确定后规则出现的情况,按照固定的模式去编写即可。

确定实现方式

可以使用纯Java方式实现,也可以使用XPath方式实现。

对于纯Java方式,PMD框架本身实现了对AST数的遍历,用户只要在遍历各个节点的时候,对自定义规则的各种情况进行分析判断即可,过程类似与DOM文件的SAX解析,以流和事件的方式来解析AST内容。

对于XPath方式,则是将AST作为一个XML数,以XPath的方式来遍历解析内容。

根据测试代码确定可能出现的情况

PMD自带了一个designer,可以用来生成对应代码的AST内容。对于本文需要达到的效果&#x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值