自定义SonarQube Java规则

2023-10-27

自定义SonarQube扫描Java Rule


在介绍如何自定义规则之前,先介绍一下这几个产品:

  • SonarQube 代码质量管理平台
  • PMD 源代码分析器
  • FindBugs Java源代码分析器,查找代码Bug
  • Sonar-PMD Sonar市场提供的PMD插件开源项目
  • P3C Alibaba的代码规范,提供了IDEA、Eclipse和PMD三个版本

虽然开源平台已经帮我们提供众多的Java安全和代码Bug的校验规则(如:P3C、PMD、FindBugs、Sonar Way),但是这些可能仍然无法满足公司对于代码的校验,例如:公司规定不得以老板的姓名作为变量名(类似的需求);因此我们不得不按照老板的规定,来扫描同事们的代码。如何来定义一个自己的Java规范呢,Sonar文档中已有说明:Sonar Doc

按照文档说明,我们应该从头开始开发一个Sonar插件,这显然是非常耗时的,因此我们直接Fork Sonar-PMD 进行修改只需要集成自定义的规则即可。接下来我们就直接进入实操环节,我们以不能将变量定义为password为例。因设计规则需要XPath,请自行学习。

开发一条PMD的规则步骤如下:

1. 设计规则

因为我们使用的源码分析器是PMD,因此我们需要使用PMD的规则设计方式,参考文档:PMD 规则设计
PMD的规则设计器可以帮助我们辅助分析AST 可视化的规则设计器

2. 编写规则

将设计器里的规则copy出来,我们设计为Xpath或使用Java代码分析AST。
我们以不能将变量名称定义为password为例:

  • Xpath定义方式
//VariableDeclaratorId[@Image = "password"]
  • Java代码定义方式
public class DontDefinePasswordRule extends AbstractJavaRule{

	@Override
	public Object visit(ASTVariableDeclaratorId node, Object data) {
		if ("password".equalsIgnoreCase(node.getName()) ) {
            // reports a violation at the position of the node
            // the "data" parameter is a context object handed to by your rule
            // the message for the violation is the message defined in the rule declaration XML element
            addViolation(data, node);
        }
		
		return super.visit(node, data);
	}
	
}

3. 配置Rule

我们可以根据规则的分类,为不同的规则建立不同的规则文件,例如示例的这个配置文件:src\main\resources\rulesets\java\myrule-other.xml

  • Java代码配置方式
<rule name="DontDefinePasswordRule" language="java"
        message="Do not define a variable named password"
        class="com.myrule.pmd.rule.DontDefinePasswordRule">
        <description>Do not define a variable named password</description>
        <priority>1</priority>
        <example>
<![CDATA[
    private String pwd = "xxxx";
]]>
      </example>
    </rule>
  • XPath配置方式
 <rule name="AbstractClassWithoutAnyMethod"
          language="java"
          since="4.2"
          class="net.sourceforge.pmd.lang.rule.XPathRule"
          typeResolution="true"
          message="No abstract method which means that the keyword is most likely used to prevent instantiation. Use a private or protected constructor instead."
          externalInfoUrl="https://pmd.github.io/pmd-6.31.0/pmd_rules_java_design.html#abstractclasswithoutanymethod">
        <description>
If an abstract class does not provides any methods, it may be acting as a simple data container
that is not meant to be instantiated. In this case, it is probably better to use a private or
protected constructor in order to prevent instantiation than make the class misleadingly abstract.
        </description>
        <priority>1</priority>
        <properties>
            <property name="version" value="2.0"/>
            <property name="xpath">
                <value>
<![CDATA[
//ClassOrInterfaceDeclaration
    [@Abstract = true()]
    [not(./ClassOrInterfaceBody/*/ConstructorDeclaration)]
    [not(./ClassOrInterfaceBody/*/MethodDeclaration)]
    [not(../Annotation/MarkerAnnotation/Name[pmd-java:typeIs('com.google.auto.value.AutoValue')])]
]]>
                </value>
            </property>
        </properties>
        <example>
<![CDATA[
public abstract class Example {
    String field;
    int otherField;
}
]]>
        </example>
    </rule>

4. 配置规则查找的文件

配置文件地址:src\main\resources\org\sonar\plugins\pmd\rules-myrule.xml

<rule key="DontDefinePasswordRule">
        <priority>MAJOR</priority>
        <configKey><![CDATA[rulesets/java/myrule-other.xml/DontDefinePasswordRule]]></configKey>
</rule>

5. 配置规则属性

配置文件地址:src\main\resources\org\sonar\l10n\pmd.properties

rule.pmd.DontDefinePasswordRule.name=[myrule]Do not define a variable named password.

6. 配置规则示例

配置文件地址:src\main\resources\org\sonar\l10n\pmd\rules\pmd-myrule
每个规则一个html文件

Do not define a variable named password. Examples:
<pre>
    private String pwd;
</pre>

7. 配置PMD model文件

配置文件地址:src\main\resources\com\sonar\sqale\pmd-model.xml
在最后的Myrule PMD中添加clc

<chc>
    <rule-repo>pmd</rule-repo>
    <rule-key>DontDefinePasswordRule</rule-key>
    <prop>
        <key>remediationFunction</key>
        <txt>CONSTANT_ISSUE</txt>
    </prop>
    <prop>
        <key>offset</key>
        <val>2</val>
        <txt>min</txt>
    </prop>
</chc>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义SonarQube Java规则 的相关文章

随机推荐

  • 2.2.2新版Banner轮播图实现

    随着Android弃用了jcenter库以后 Banner的使用也大大的和以前不同 下面就来介绍一下2 2 2版本banner的使用和Demo 文章目录 一 改进内容 二 Demo效果图 二 步骤 1 引入库 依赖banner 2 xml文
  • OSS对象存储

    文章目录 OSS 1 存储分类 2 对象存储OSS 2 1 概念组成 2 2 存储优势 2 3 与自建服务器的优势 2 4 Bucket存储空间 2 5 存储类型 2 6 对象 2 6 1 命名规范 2 6 2 存储空间与对象关系 2 7
  • Android编译系统-envsetup和lunch代码篇

    Android系统启动篇 1 android系统启动流程简介 2 android init进程启动流程 3 android zygote进程启动流程 4 Android SystemServer进程启动流程 5 android launch
  • mysql组成部分

    一 mysql组成部分 组成部分 1 连接池组件 2 管理服务和工具组件 3 SQL接口组件 4 查询分析器组件 5 优化器组件 6 缓存 cache 组件 7 插件式存储引擎 8 物理文件 1 mysql存储引擎 1 1 InnoDB存储
  • KMP算法原理详解_论文解读版

    1 KMP算法 KMP算法是一种保证线性时间的字符串查找算法 由Knuth Morris和Pratt三位大神发明 而算法取自这三人名字的首字母 因而得名KMP算法 那发明这样的字符串查找算法又有什么用 在当时计算机本身非常昂贵 计算资源更是
  • 531-C++迭代器失效问题及解决方法

    初步在自定义vector类中实现迭代器 迭代器示意图 为什么方式都是一样 因为迭代器遍历完当前元素跳到下一个元素 底层数据结构的具体的遍历方式都封装在这个迭代器的 运算符函数了 所以 作为使用方 我们不需要知道底层的数据结构原理 我们只知道
  • 寄存器堆计算机组成实验,杭电计算机组成原理寄存器堆设计实验4

    杭电计算机组成原理寄存器堆设计实验4 5页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 9 9 积分 杭州电子科技大学计算机学院实验报告课程名称 计算机组成原理 实验项目 寄存器堆设计实验姓班级 指
  • C语言实现斐波那契数列

    先来说说啥是斐波那契数列 它是一个前两位都为1 从第三位开始 后一位为前两位之和的递增数列 也就是 1 1 2 3 5 8 13 21 34 55 89 我们可以发现 如果你要找第n位的数 其实它就等于第 n 1 位和第 n 2 位之和 那
  • IOS 关于 NSUserDefault

    转载 并不是所有的东西都能往里放的 NSUserDefaults只支持 NSString NSNumber NSDate NSArray NSDictionary NSUserDefaults的方法中用来记录一下永久保留的数据非常方便 不需
  • 大数据手册(Spark)--Spark机器学习(PySpark版)

    文章目录 MLlib ML 常见的特征转换 模型拟合和描述 超参调优 Spark安装配置 Spark基本概念 Spark基础知识 PySpark版 Spark机器学习 PySpark版 Spark流数据处理 PySpark版 MLlib A
  • java创建任意长度空格字符串_输入任意长的一个字符串,统计其字母、数字、空格及其他字符的数量。...

    标签 思路 简单的利用一个多重 if 结构就可以解决 CODE import java util Scanner public class Character public static void main String args Syst
  • 经纬度正则表达式

    经度 180 0 180 0 整数部分为0 180 输入1到8位小数 0 d 1 8 1 9 d d 1 8 1 0 7 d 1 d 1 8 180 0 1 8 纬度 90 0 90 0 整数部分为0 90 输入1到8位小数 0 1 8 d
  • ant上传组件upload,前端读取文件、创建文件

    业务需求是用户上传文件后 还能修改文件内容 最后保存修改后的文件 实现方式 1 前端读取文件内容后显示在代码编辑器中 方便用户修改 2 点保存按钮时 拿到改变的文件内容后 创建新的文件流 提交给后端 这里演示的是JSON文件数据 选择文件
  • 图显系统DRM CRTC完全解析

    目录 CRTC 工作原理和意义 CRTC 模块的初始化和功能 0 引言 DRM 下的 CRTC 代表 RGB 数据管道 从 drm plane 接收像素数据并将其混合到一起 传输给下级显示设备 drm encoder 由 drm displ
  • 原址删除有序数组重复整数

    给定一个有序数组 原址删除重复超过两次的整数 本笔记适合熟悉Python列表list的 coder 翻阅 学习的细节是欢悦的历程 Python 官网 https www python org Free 大咖免费 圣经 教程 python 完
  • Spring中bean创建的生命周期

    1 推断构造方法 2 实例化 3 依赖注入 4 处理Award回调beanFatoryAware 5 初始化前 处理 postConstruct注解 6 初始化 处理iniyializingBean接口 7 初始化前 进行aop
  • Distributed Database System —— Multi-raft协议介绍

    文章目录 Multi Raft协议 Multi Raft需要解决的问题 Multi Raft实现细节 Cockroach Multi Raft Raft Consistency of Range Replicas Range Leaders
  • SQL备份表数据

    1 情况说明 对某个表 需要进行某些删除或修改操作测试 但也需要数据还原 所以需要备份表中数据 2 思路分析 一般操作 将表A所有的数据 备份到新建表B中 若有其他更屌的操作 请告诉我 万分感谢 3 具体SQL实现 库类型说明 SQL SE
  • Java编程--IO流(Ⅱ 字节流)

    Java编程 IO流 字节流 File类虽然可以操作文件 但是并不是操作文件的内容 若要进行文件内容的操作只能通过两种途径完成 字节流和字符流 若要进行输入及输出操作一般都会按照如下的步骤进行 以文件操作为例 1 通过File类定义一个要操
  • 自定义SonarQube Java规则

    自定义SonarQube扫描Java Rule 在介绍如何自定义规则之前 先介绍一下这几个产品 SonarQube 代码质量管理平台 PMD 源代码分析器 FindBugs Java源代码分析器 查找代码Bug Sonar PMD Sona