Loading

(转)定制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:\devtools\eclipse_3.5.1\plugins\edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821\findbugs-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,看到结果出现..

posted @ 2016-07-15 00:34  元宝爸爸  阅读(626)  评论(0编辑  收藏  举报