当前位置: 首页 > news >正文

【代码安全】spotbugs编写自定义规则(一) 快速开始

在这里插入图片描述

注:图片来自官网,侵删

本小节主要讲解如何创建一个spotbugs的自定义规则检测项目,不具体展开规则编写,这里以IDEA为例

一、创建项目

首先,创建一个maven项目。这里可以使用maven archetype的方式创建。具体的版本信息可以参考https://mvnrepository.com/artifact/com.github.spotbugs/spotbugs-archetype

groupId: com.github.spotbugs
artifactId: spotbugs-archetype
version: 0.2.7

在这里插入图片描述

二、初识项目结构

项目创建成功后,项目结构如下
在这里插入图片描述

  1. MyDetector所在目录org.example是检测代码的核心目录,MyDetector是生成的demo
package org.example;

import org.apache.bcel.Const;

import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;

public class MyDetector extends OpcodeStackDetector {
    private final BugReporter bugReporter;

    public MyDetector(BugReporter bugReporter) {
        this.bugReporter = bugReporter;
    }

    @Override
    public void sawOpcode(int seen) {
        if (seen != Const.GETSTATIC) {
            return;
        }
        if (getClassConstantOperand().equals("java/lang/System")
                && getNameConstantOperand().equals("out")) {
            // report bug when System.out is used in code
            BugInstance bug = new BugInstance(this, "MY_BUG", NORMAL_PRIORITY)
                    .addClassAndMethod(this)
                    .addSourceLine(this, getPC());
            bugReporter.reportBug(bug);
        }
    }
}

spotbugs是基于class文件进行分析检测的,通过继承类和方法中的"OpCode"能窥探一二

  1. findbugs.xml和messages.xml是用于配置检测器规则(如前面的MyDetector)和相关的报告信息的。其中,messages.xml支持国际化(如著名的find-sec-bugs中,配置的messages_ja.xml是日文版本)

findbugs.xml

<?xml version="1.0" encoding="UTF-8"?>
<FindbugsPlugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="findbugsplugin.xsd"
        pluginid="org.example.UserIdentityDetect">

        <Detector class="org.example.MyDetector" reports="MY_BUG" />

        <BugPattern abbrev="MY" type="MY_BUG" category="CORRECTNESS" />
</FindbugsPlugin>

messages.xml

<?xml version="1.0" encoding="UTF-8"?>
<MessageCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="messagecollection.xsd">

  <Plugin>
    <ShortDescription>My SpotBugs Plugin</ShortDescription>
    <Details>This plugin provides original detectors</Details>
  </Plugin>

  <Detector class="org.example.MyDetector">
    <Details>
      Original detector to detect MY_BUG bug pattern.
    </Details>
  </Detector>

  <BugPattern type="MY_BUG">
    <ShortDescription>Explain bug pattern shortly.</ShortDescription>
    <LongDescription>
      Explain existing problem in code, and how developer should improve their implementation.
    </LongDescription>
    <Details>
<![CDATA[
<p>Explain existing problem in code, and how developer should improve their implementation.</p>
]]>
    </Details>
  </BugPattern>

  <BugCode abbrev="MY">My SpotBugs BugCode</BugCode>
</MessageCollection>
  1. test目录下是单元测试程序demo,这里不多赘述

三、使用demo程序

  1. 打包自定义的规则插件。使用IDEA自带的maven打包工具即可,或者使用maven打包命令,最终产物是一个jar文件

在这里插入图片描述

  1. 打开IDEA的设置面板,搜索spotbugs,点击SpotBugs进入配置界面,点击Install Plugin from Disk…(从磁盘安装插件)即可

在这里插入图片描述

在这里插入图片描述
勾选即可
在这里插入图片描述

  1. 随便找一个程序进行测试即可,这里使用的demo是一个简单的springboot项目,打印了一串用于测试的信息"unsecure message"(demo测试规则是检测所有使用了System.out的地方)

在这里插入图片描述

  1. 最终检测到打印输出

在这里插入图片描述

相关文章:

  • 【数据可视化艺术·实战篇】视频AI+人流可视化:如何让数据“动”起来?
  • 每日OJ_牛客_ruby和薯条_排序+二分/滑动窗口_C++_Java
  • vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值。
  • C语言中常用的调试宏和函数总结(__LINE__、__FUNCTION__)
  • Swift的学习笔记(一)
  • 学生考勤管理系统(jsp+ssh+mysql5.x)含文档
  • 【清华大学】DeepSeek与AI幻觉
  • AIGC-文生图与图生图
  • Vision Mamba修改为自己的目标检测数据集
  • linux多线(进)程编程——(2)身外化身fork()
  • 概率论与数理统计核心知识点与公式总结(就业版)
  • C++进阶——异常
  • 计算机组成原理-系统总线
  • Hibernate(JPA) 和 MyBatis 的对比
  • Java基础关键_036_Stream
  • 使用Python实现矢量路径的压缩、解压与可视化
  • Python | 在Pandas中按照中值对箱形图排序
  • 二叉树的最近公共祖先二叉搜索树的最近公共祖先
  • 25届双非控制硕士求职回顾
  • ARM架构FFmpeg极致优化交叉编译指南
  • 《缶翁的世界》首发:看吴昌硕等湖州籍书画家的影响
  • 江苏疾控:下设部门无“病毒研究所”,常荣山非本单位工作人员
  • 倒票“黄牛”屡禁不绝怎么破?业内:强化文旅市场票务公开制度
  • 国宝归来!子弹库帛书二、三卷抵达北京
  • 上海比常年平均时间提前12天入夏,明天最高气温可达33℃
  • 中央提级巡视后,昆明厅官郭子贞接受审查调查