zoukankan      html  css  js  c++  java
  • (转)定制findbugs规则

    转载自http://www.51testing.com/html/97/13997-211893.html

    这类文章极少,字节码操作需要对becl库及jvm字节码操作有一定常识。参考:

    http://blog.csdn.net/lywybo/archive/2010/03/01/5335748.aspx

    http://javadevelopmentforthemasses.blogspot.com/2008/09/custom-findbugs-detectors-and-maven.html

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

     

    ibm介绍的原理实用,但配置过时;支付宝朋友写的message.xml/findbugs.xml不够详细且有笔误。

     

    1.1      准备

    下载findbugs:http://sourceforge.net/projects/findbugs/files/findbugs/1.3.9/findbugs-1.3.9.zip/download

     

    修改build.xml ,去除所有的validate依赖。执行ant编译。

    eclipse引入findbugs工程

     

    1.2      实现类

    直接在findbugs目录中增加类

     

    packageedu.umd.cs.findbugs.detect;

    importorg.apache.bcel.classfile.Code;

    importedu.umd.cs.findbugs.BugInstance;

    importedu.umd.cs.findbugs.BugReporter;

    importedu.umd.cs.findbugs.bcel.OpcodeStackDetector;

     

    /**

     *@authorbo

     *这个规则类用于判断System.out和System.error这种情况

     */

    publicclassForbiddenSystemClassextendsOpcodeStackDetector{

     BugReporterbugReporter;

     

     publicForbiddenSystemClass(BugReporter bugReporter) {

     this.bugReporter= bugReporter;

     }

     

     /**

     * visit方法,在每次进入字节码方法的时候调用

     *在每次进入新方法的时候清空标志位

     */

     @Override

     publicvoidvisit(Code obj) {

     super.visit(obj);

     }

     

     /**

     *每扫描一条字节码就会进入sawOpcode方法

     *

     *@paramseen 字节码的枚举值

     */

     @Override

     publicvoidsawOpcode(intseen) {

     if(seen ==GETSTATIC) {

      if(getClassConstantOperand().equals("java/lang/System")

              && (getNameConstantOperand().equals("out") || getNameConstantOperand().equals("error"))) {

       BugInstance bug =newBugInstance(this,"ALP_SYSTEMCLASS",NORMAL_PRIORITY).addClassAndMethod(this)

               .addSourceLine(this, getPC());

       bug.addInt(getPC());

       bugReporter.reportBug(bug);

      }

     }

     }

    }

    1.3      修改etc目录配置文件findbugs.xmlmessage.xml

    不支持中文注释。

    findbugs.xml增加内容。

    <Detectorclass="edu.umd.cs.findbugs.detect.ForbiddenSystemClass" 

      speed="fast"

        reports="ALP_SYSTEMCLASS"

        hidden="false"/>

    <BugPatternabbrev="LIANGJZFORBIDDENSYSTEMCALSS"type="ALP_SYSTEMCLASS"category="EXPERIMENTAL" />

    Message.xml增加:

     

    <Detectorclass="edu.umd.cs.findbugs.detect.ForbiddenSystemClass">

      <Details>

       <![CDATA[

       <p>category:detector find System.out/System.error

       <p>please use log4j

       ]]>

      </Details>

     </Detector>

     

    <BugPatterntype="ALP_SYSTEMCLASS">

       <ShortDescription>short desc:System.out/error</ShortDescription>

       <LongDescription>class={0},method {1}long desc:System.out,please use log4j</LongDescription>

       <Details>

     <![CDATA[

       <p>detail info see log4j document</p>

     ]]>

       </Details>

     </BugPattern>

     

     

     

    1.4      用findbugs图形化界面测试

    点击bin/finbugs.bat,打开扫描的.class目录。看到扫描带System.out或者System.error.class放到experimental类错误时,验证成功。

     

    1.5      替换eclipse findbugs-plugin.jar文件

    用winrar打开

    D:devtoolseclipse_3.5.1pluginsedu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821findbugs-plugin.jar中message.xml,findbugs.xml,z加入二进制的edu.umd.cs.findbugs.detect.ForbiddenSystemClass。

     

    重启elipse,还需要确保experimental类的错误能在findbugs窗口展现:windows->preferences->java->findbugs->reporter configuration上的experimental选项勾上。

     

     

     

     执行findbugs扫描.class,看到结果出现..

    作者: 元宝爸爸

    出处:https://www.cnblogs.com/wozixiaoyao/p/11965398.html

    版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

    觉得文章不错,点个关注呗!

  • 相关阅读:
    高德车载导航自研图片格式的探索和实践
    导航定位向高精定位的演进与实践
    高德算法工程一体化实践和思考
    机器学习在高德用户反馈信息处理中的实践
    UI自动化技术在高德的实践
    高德网络定位算法的演进
    系统重构的道与术
    基于深度学习的图像分割在高德的实践
    MySQL索引那些事
    如何优雅的将Mybatis日志中的Preparing与Parameters转换为可执行SQL
  • 原文地址:https://www.cnblogs.com/xinrong2019/p/5672181.html
Copyright © 2011-2022 走看看