findbugs自定义规则并配置实现检测

findbugs不过多介绍了,对于这个主题找了一些资料,没有找到一个完整的介绍,要么是介绍怎么写detector,要么就是没有完整的介绍怎么配置生效,下面主要介绍一下怎么配置其生效,至于怎么写这个detector还是有很多资料说明的,不过在些也重复一下。

一、自定义detector

1 ForbidSystemOutClass检测类

package com.test.findbugs;  

import org.apache.bcel.classfile.Code;

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

public class ForbidSystemOutClass extends OpcodeStackDetector {  

    private BugReporter bugReporter;  

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

    @Override
    public void visit(Code obj) {
        super.visit(obj);
    }  

    @Override
    public void sawOpcode(int seen) {  

        if (seen == GETSTATIC) {

            if ("java/lang/System".equals(getClassConstantOperand())
                    && ("out".equals(getNameConstantOperand()) || "error".equals(getNameConstantOperand()))) {

                bugReporter.reportBug( new BugInstance("SYSTEM_OUT_ERROR", HIGH_PRIORITY)
                                        .addClassAndMethod(this).addSourceLine(this));
            }
        }  

    }
}  

参考:http://blog.csdn.net/franklies/article/details/6830534

https://www.ibm.com/developerworks/cn/java/j-findbug2/

至于里面的一些相关逻辑不在此探讨之内;

2 findbugs.xml

<FindbugsPlugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:noNamespaceSchemaLocation="findbugsplugin.xsd"
                pluginid="com.test.findbugs"
                defaultenabled="true"
                provider="test">
    <Detector class="com.test.findbugs.ForbidSystemOutClass" speed="fast" />
    <BugPattern type="SYSTEM_OUT_ERROR" abbrev="SFC" category="PERFORMANCE" />
</FindbugsPlugin>

3 messages.xml

<?xml version="1.0" encoding="UTF-8"?>

<MessageCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:noNamespaceSchemaLocation="messagecollection.xsd">
    <Detector class="com.test.findbugs.ForbidSystemOutClass" >
        <Details>
            <![CDATA[
                <p>detector decription
            ]]>
        </Details>
    </Detector>

    <BugPattern type="SYSTEM_OUT_ERROR">
        <ShortDescription>short decription</ShortDescription>
        <LongDescription>long decription</LongDescription>

        <Details>
            <![CDATA[
                <p> System.out can‘t be released, you must delete it.
            ]]>
        </Details>
    </BugPattern>

    <BugCode abbrev="SFC">System.out can‘t allow</BugCode>
</MessageCollection>

参考:http://www.warski.org/staticaccess.html,这两个xml文件直接是从这个开源工程里面拿出来修改的

自定义检测规则主要有这三个步骤,写完这三个,剩下的工作就是编译配置;

二、编译配置

主要是编写ant脚本

<?xml version="1.0" encoding="UTF-8"?>
 <project name="typestatechecker" default="dist" basedir=".">
    <description>Builds the Systemout Checker.</description>

    <property file="build.properties" />

    <property name="src" value="src"/>
    <property name="etc" value="etc"/>
    <property name="bin" value="bin"/>
    <property name="dist.file" value="testFindBugs.jar"/>

    <target name="clean" description="Remove generated files">
        <delete dir="${bin}"/>
    </target>

    <target name="prep" depends="clean" description="Create required directories">
        <mkdir dir="${bin}"/>
    </target>

    <path id="build.src.main.path">
        <pathelement location="${findbugs.home}/lib/findbugs.jar" />
    </path>

    <target name="build" depends="prep" description="Compile files">
        <javac srcdir="${src}"          classpathref="build.src.main.path"  destdir="${bin}" />
    </target>

    <target name="dist" depends="build" description="Create jar file">
        <jar destfile="${findbugs.home}/plugin/${dist.file}">
            <fileset dir="${bin}" />
            <fileset dir="${src}" />
            <fileset dir="${etc}" />
        </jar>
    </target>
</project>

使用ant命令:

ant dist

编译过程如下:

  

在ant配置脚本中已经默认把生成的testFindBugs.jar包放到findbugs安装目录里面的plugin中,对于自定义的规则,打成jar包后,放在这个plugin目录就会自动生效,而不是像网上介绍的那样放在findbugs.jar包中。

三、检测

<?xml version="1.0" encoding="UTF-8"?>
 <project name="typestatechecker" default="dist" basedir=".">
    <description>Builds the Systemout Checker.</description>

    <property file="build.properties" />

    <property name="src" value="src"/>
    <property name="etc" value="etc"/>
    <property name="bin" value="bin"/>
    <property name="dist.file" value="testFindBugs.jar"/>

    <target name="clean" description="Remove generated files">
        <delete dir="${bin}"/>
    </target>

    <target name="prep" depends="clean" description="Create required directories">
        <mkdir dir="${bin}"/>
    </target>

    <path id="build.src.main.path">
        <pathelement location="${findbugs.home}/lib/findbugs.jar" />
    </path>

    <target name="build" depends="prep" description="Compile files">
        <javac srcdir="${src}"          classpathref="build.src.main.path"  destdir="${bin}" />
    </target>

    <target name="dist" depends="build" description="Create jar file">
        <jar destfile="${findbugs.home}/plugin/${dist.file}">
            <fileset dir="${bin}" />
            <fileset dir="${src}" />
            <fileset dir="${etc}" />
        </jar>
    </target>

    <!-- exec findbugs -->
    <target name="findbugs" depends="build">

        <path id="findbugs_lib" >
            <fileset dir="${findbugs.home}/lib/" >
                <include name="*.jar" />
            </fileset>
        </path>

        <taskdef
            name="findbugs"
            classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
            classpathref="findbugs_lib" />

        <findbugs
            home="${findbugs.home}"
            output="xml"
            outputFile="${bin}/findbugs_result.xml" >

            <class location="${bin}" />
            <sourcePath path="${src}" />

        </findbugs>
    </target>

</project>

使用ant命令:

ant findbugs

  过程如下:

ok了,可以在工程的bin目录下,看到findbugs检测生成的结果findbugs_result.xml文件,至此整个过程结束,以上只上讲解了一个配置及过程,至于findbugs规则的具体编写以及findbugs.xml、message.xml里面的每个符号代表的意思没有涉及,向findbugs迈出了一步,接下来还是需要更多的时间摸索。

另外怎么在eclipse的插件中配置自定义的规则还是个问题,试过,可以把规则加进来,但检测的时候却没有生效,目前还没有找到原因。

附上测试工程:

右键保存这张图片到本地,然后把扩展名改成zip,解压就OK了。

时间: 2024-10-11 11:22:26

findbugs自定义规则并配置实现检测的相关文章

1. PMD 使用,编译和自定义规则

一 PMD简介 PMD是一款代码静态检查工具,可以检查出很多代码中潜在的bug以及让人感到疑惑的代码,具体大家可以百度下. 二 PMD源代码下载 下载地址: https://github.com/pmd/pmd/tree/pmd/5.5.x 需要注意的是注意选择branch,一般选择最新的branch:然后可以用git clone下来,或者直接下载zip压缩包. 如下: 从上图也可以看到,pmd支持的语言有很多,java的检测那就是在pmd-java里面. 三 maven下载和环境变量配置 参考

AWS Config 自定义规则

此过程将引导您完成自定义规则的创建过程,该规则可以评估您的各个 EC2 实例是否为 t2.micro 类型.AWS Config 将针对此规则运行基于事件的评估,这意味着 AWS Config 每次检测到实例配置更改时,都会检查您的实例配置.AWS Config 会将 t2.micro 实例标记为合规实例,并将其他所有实例标记为不合规实例.合规性状态将显示在 AWS Config 控制台中. 为保证这一程序的最佳效果,您的 AWS 账户应该拥有一个或多个 EC2 实例.您的实例中应包含至少一个

StyleCop学习笔记——自定义规则

本文将简单的一步一步的指导这可能有助于学习如何创建自己的规则 1.创建一个项目. Visual Studio创建一个新的类库项目.NET3.5 2.引用两个DLL,StyleCop.dll和StyleCop.Csharp.dll. 3.添加自定义的规则. MyCustomAnalyzer.cs代码如下: using StyleCop; using StyleCop.CSharp; namespace MyCustomRules { /// <summary> /// Custom analyz

EMS 动手实验2:用户自助密码重设&amp;条件访问策略强制用户使用MFA二次验证&amp;启用标识保护配置风险检测

前言: 本系列实验将引导用户完成O365 企业移动性和安全性(Enterprise Mobility Security)的常用操作和配置,本着实用性和安全性的原则,该系列实验会建议一些最佳实践.本系列实验主要分为以下几个阶段: 将Azure AD 登陆和审核日志发送到Azure Monitor 用户自助密码重设&条件访问策略强制用户使用MFA二次验证&启用标识保护配置风险检测 使用 Privileged Identity Management建立管理角色的审批和授权 使用Intune 管理

karaf加入自定义log4j的配置

配置文件: karaf_home/etc/org.ops4j.pax.logging.cfg 加入配置: ### direct log messages to stdout ### log4j.appender.consoleout=org.apache.log4j.ConsoleAppender log4j.appender.consoleout.layout=org.apache.log4j.PatternLayout log4j.appender.consoleout.layout.Con

【猪猪-后端】WebMagic框架搭建的爬虫,根据自定义规则,直接抓取,使用灵活,Demo部署即可查看。

原文:[猪猪-后端]WebMagic框架搭建的爬虫,根据自定义规则,直接抓取,使用灵活,Demo部署即可查看. 源代码下载地址:http://www.zuidaima.com/share/1581523414404096.htm 如果要使用注解方式实现,也是支持的. @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") public class OschinaBlog { @ExtractBy("//title&qu

如何使用PMD自定义规则

准备工作 首先在PMD官网下载最新版本的文件,目前最新版本是5.4.1. 下载pmd-bin-5.4.1.zip和pmd-src-5.4.1.zip之后解压备用. pmd-src-5.4.1是PMD源码包,是无法直接执行的. pmd-bin-5.4.1是PMD的可执行包 目录简介 pmd-src-5.4.1中除了pmd-core是PMD的核心执行调度模块,其他文件夹都是各种语言检查规则的模块. 其中pmd-bin-5.4.1\lib目录中是执行所依赖的jar包. pmd-bin-5.4.1\bi

yii 框架 自定义规则客户端验证

前提:yii 自定义规则不能通过失去焦点验证 view层中:设置form的3个属性,validationUrl 可以不设置,默认为当前页面,但是一般情况验证不会跟提交数据在一个方法中处理 $form = zActiveForm::begin([ 'id'=> 'validate', 'enableAjaxValidation'=> true, 'validationUrl' => \yii\helpers\Url::toRoute('/hotel/hotel-room/validate-

zabbix自定义监控脚本配置

实验环境 环境 IP 服务端 192.168.24.168 客户端 192.168.24.188 实验条件: zabbix监控服务器.客户端都已经部署完成,被监控主机已添加完成,zabbix监控运行正常.zabbix服务器设置邮箱报警运行正常. 实现目的: zabbix自定义监控客户端用户量,当用户量大于三个以上,会自动发送报警邮件到指定的邮箱. 实验步骤 1.修改客户端配置文件 [[email protected] ~]# vim /usr/local/etc/zabbix_agentd.co