转载自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.xml和message.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,看到结果出现..

(转)定制findbugs规则的更多相关文章

  1. FindBugs规则整理

    http://blog.csdn.net/jdsjlzx/article/details/21472253/ 配置FindBugs和常见FindBugs错误 http://blog.csdn.net/ ...

  2. findbugs规则

    FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查 ...

  3. EF里如何定制实体的验证规则和实现IObjectWithState接口进行验证以及多个实体的同时验证

    之前的Code First系列文章已经演示了如何使用Fluent API和Data Annotation的方式配置实体的属性,比如配置Destination类的Name属性长度不大于50等.本文介绍E ...

  4. 利用Sonar定制自定义JS扫描规则(三)——SSLR JavaScript Toolkit 使用说明

    在上一篇blog中讲了在sonar中如何新增自定义的JS规则,这里面比较难的地方是XPath语句的编写,而要编写正确的XPath语句,首先要拿到语法的AST,下面我们就来介绍如何使用SSLR Java ...

  5. 配置FindBugs和常见FindBugs错误

    配置FindBugs: 在这里可以对FindBugs规则等进行详细设置. 选择你的项目,右键 => Properties => FindBugs => 1 Run Automatic ...

  6. ASP.NET MVC URL重写与优化(1)-使用Global路由表定制URL

    ASP.NET MVC URL重写与优化(1)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量. ...

  7. Linux makefile教程之隐含规则九[转]

    隐含规则 ———— 在 我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o] 文件,Windows下是[.o ...

  8. Makefile详解--隐含规则

    Makefile详解--隐含规则(转) Makefile系列文章,这里有个前辈连续洗了一个系列来介绍,共有26篇博客文章. http://www.cppblog.com/ivenher/archive ...

  9. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

随机推荐

  1. luogu P1310 表达式的值

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  2. CodeForces - 11D A Simple Task

    Discription Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycl ...

  3. trick点

    1.问题里有取模操作的时候,最后输出(ans+mod)%mod 2.涉及到输出实数0的时候要特判输出的会不是是-0.000000(因为0.00乘一个负的浮点数结果是-0.000000,乘一个正的浮点数 ...

  4. LINUX___的常用几个快捷键

    linux下:ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程.常用于终止正在运行的程序.ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程.ctrl- ...

  5. 简约至上.md

    中秋花了一天多时间阅读了简约至上这本书,书中内容不多,主要是向我们传达了产品设计的4个要素,给了产品经理设计产品时的一些要义指导; 一产品定位 在进行产品设计之前,首页需要对这款产品的商业定位需要有个 ...

  6. 【hibernate postgresql】注解@TypeDef/@Enumerated/数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" is of type gender but expression is of type character varying

    数据库字段gender为枚举类型,从前台接受到实体后进行保存报错:org.postgresql.util.PSQLException: ERROR: column "gender" ...

  7. 【iOS开发-58】tableView初识:5个重要方法的使用和2种样式的差别

    创建一个tableView,直接拖拽放在storyboard里面就可以. (1)先创建一个数据模型类WSCarGroup,在WSCarGroup.h文件里: #import <Foundatio ...

  8. DIV浮动IE文本产生3象素的bug

    描写叙述:DIV浮动IE文本产生3象素的bug    左边对象浮动.右边採用外补丁的左边距来定位,右边对象(div)会离左边有3px的间距 复现:在开发者工具里把文本模式设置了杂项后会出现3像素的bu ...

  9. construct-binary-tree-from-preorder-and-inorder-traversal——前序和中序求二叉树

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:  You may assume tha ...

  10. python(28)- 面向对象练习Ⅱ

    题目一:总结 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性? 类内定义的函数,不经装饰器装饰,被实例化对象调用,会默认传入一个self参数,对象将会传递给self: 定义方式比较 ...