详解eclipse插件findbugs新规则的开发过程
2010-03-01 14:33
441 查看
大家都知道java开发的应用,代码量都是很庞大的,并且所有的代码不可能是一个人完成的,如何保证我们代码的高质量呢?静态扫描工具findbugs是不错的选择
java应用最常见的也就是NullPointException问题了。平时我们做小的项目出几个NPE没什么太大的影响,打几个错误日志,下次修复掉就行了。但是如果是淘宝、支付宝这样的大型系统,每天用户量很大,可能一个NPE就会影响到很多用户的系统使用。findbugs会容易的找出这些问题。
有的时候findbugs不能满足我们的需求,我们需要在代码扫描阶段就发现更多的问题,那么就需要开发针对自己需求的findbugs规则。比如:生产环境的代码中是不允许有System.out.prinln("xxxxx");这样的信息出现的,必须使用log来记录日志,所以我们就可以专门写一条规则来检测代码里面是否存在System.out,如果存在就给出提示。
同样的,在使用log日志的时候,必须要先判断日志的级别然后再使用log.debug(""),所以我们可以定义一条日志来检测代码中是否存在没有使用if条件判断就直接log.debug(),有的话给出提示。
进入正题,通过找代码中是否存在System.out来讲解findbugs规则的开发过程
效果:
准备工作:
1 findbugs源码的下载下载路径:
http://code.google.com/p/findbugs/source/checkout 通过svn下载,svn命令: Svn checkout http://findbugs.googlecode.com/svn/trunk/ findbugs-read-only
2 将源码导入eclipse
在eclipse中选择import --- plug-ins and fragments,选择下载的findbugs源码的路径import as选项卡中选择 projects with source folders
添加plug-ins的时候记得不要选择中间的那个,中间的是test,也可以选择全导入
3 项目环境设置
在edu.umd.cs.findbugs.plugin.eclipse项目中找到plugin.xm用manifest editor打开,在build选项卡中add Library:findbugs-plugin.jar,选中findbugs-plugin.jar,add folder:src
在findbugs项目中找到MANIFEST.MF,在build中add Library:findbugs.jar,选中findbugs-plugin.jar,add folder:src/java,src/java5,src/tools,src/antTask
开发新规则:
1.首先认识几个文件
Findbugs.xml
对于每一个新的检测器,在 FindBugs.xml 文件中增加一个 Detector 元素和一个 BugPattern 元素。 Detector 元素指定用于实现检测器的类以及它是快速还是慢速检测器。其中reports属性是和edu.umd.cs.findbugs.detect中类report的错误相对应的和Bugpattern中的type一致且唯一。
category 属性是枚举类型。
它是以下类型中的一种:
CORRECTNESS :一般正确性问题
MT_CORRECTNESS :多线程正确性问题
MALICIOUS_CODE :如果公开给恶意代码,有可能成为攻击点
PERFORMANCE :性能问题
Message.xml
messages.xml 文件由三个元素组成: Detector 、 BugPattern 和 BugCode 。检测器的 class 属性应当指定检测器的类名。 Details 元素包含检测器的简单 HTML 描述,这里面主要写错误的提示信息。
FindBugs 利用了 Byte Code Engineering Library,称为 BCEL,以实现其检测器。所有字节码扫描检测器都基于 visitor 模式。侧重于两个方法------ visit(Code) 和 sawOpcode(int) 。在 FindBugs 分析类时,它会在分析方法内容时调用 visit(Code) 方法。与此类似,FindBugs 在分析方法正文中的每一个操作码时调用 sawOpcode(int) 方法。
下面我们看一个列子:在企业级开发中,是不允许用System.out来输出信息的,必须要用log日志来打印出信息,所以我们就增加一个findbugs的新规则发现代码中有system.out的时候就给用户提示,一下是开发步骤
先看一段通过javap反编的java代码对比
源码:
Java代码
反编:
Java代码
通过反编的代码我们可以看到调用system.out.println的时候是通过
12: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
这句来执行的,所以我们只要找到getstatic指令,并判断方法调用是System.out就可以知道是用了System.out,就可以声明bug并且报告bug
findbugs代码
Java代码
new BugInstance(this, "ALP_SYSTEMCLASS", NORMAL_PRIORITY)
ALP_SYSTEMCLASS这个和findbugs.xml、message.xml中相对应
findbugs的新规则开发使用了visit模式,我们只需要实现visit方法sawOpcode方法即可,当然实现复杂功能,有不同的父类
在findbugs.xml中把自己的Detector 声明出来
Xml代码
message.xml
这里配置错误的显示信息
最终把
java类、xml按照下面这个ant脚本的描述进行打包
命令行ant就打包了,把打好的jar包放到findbugs插件的plugin目录下,重启eclipse就可以使用新的规则了
java应用最常见的也就是NullPointException问题了。平时我们做小的项目出几个NPE没什么太大的影响,打几个错误日志,下次修复掉就行了。但是如果是淘宝、支付宝这样的大型系统,每天用户量很大,可能一个NPE就会影响到很多用户的系统使用。findbugs会容易的找出这些问题。
有的时候findbugs不能满足我们的需求,我们需要在代码扫描阶段就发现更多的问题,那么就需要开发针对自己需求的findbugs规则。比如:生产环境的代码中是不允许有System.out.prinln("xxxxx");这样的信息出现的,必须使用log来记录日志,所以我们就可以专门写一条规则来检测代码里面是否存在System.out,如果存在就给出提示。
同样的,在使用log日志的时候,必须要先判断日志的级别然后再使用log.debug(""),所以我们可以定义一条日志来检测代码中是否存在没有使用if条件判断就直接log.debug(),有的话给出提示。
进入正题,通过找代码中是否存在System.out来讲解findbugs规则的开发过程
效果:
准备工作:
1 findbugs源码的下载下载路径:
http://code.google.com/p/findbugs/source/checkout 通过svn下载,svn命令: Svn checkout http://findbugs.googlecode.com/svn/trunk/ findbugs-read-only
2 将源码导入eclipse
在eclipse中选择import --- plug-ins and fragments,选择下载的findbugs源码的路径import as选项卡中选择 projects with source folders
添加plug-ins的时候记得不要选择中间的那个,中间的是test,也可以选择全导入
3 项目环境设置
在edu.umd.cs.findbugs.plugin.eclipse项目中找到plugin.xm用manifest editor打开,在build选项卡中add Library:findbugs-plugin.jar,选中findbugs-plugin.jar,add folder:src
在findbugs项目中找到MANIFEST.MF,在build中add Library:findbugs.jar,选中findbugs-plugin.jar,add folder:src/java,src/java5,src/tools,src/antTask
开发新规则:
1.首先认识几个文件
Findbugs.xml
对于每一个新的检测器,在 FindBugs.xml 文件中增加一个 Detector 元素和一个 BugPattern 元素。 Detector 元素指定用于实现检测器的类以及它是快速还是慢速检测器。其中reports属性是和edu.umd.cs.findbugs.detect中类report的错误相对应的和Bugpattern中的type一致且唯一。
category 属性是枚举类型。
它是以下类型中的一种:
CORRECTNESS :一般正确性问题
MT_CORRECTNESS :多线程正确性问题
MALICIOUS_CODE :如果公开给恶意代码,有可能成为攻击点
PERFORMANCE :性能问题
Message.xml
messages.xml 文件由三个元素组成: Detector 、 BugPattern 和 BugCode 。检测器的 class 属性应当指定检测器的类名。 Details 元素包含检测器的简单 HTML 描述,这里面主要写错误的提示信息。
FindBugs 利用了 Byte Code Engineering Library,称为 BCEL,以实现其检测器。所有字节码扫描检测器都基于 visitor 模式。侧重于两个方法------ visit(Code) 和 sawOpcode(int) 。在 FindBugs 分析类时,它会在分析方法内容时调用 visit(Code) 方法。与此类似,FindBugs 在分析方法正文中的每一个操作码时调用 sawOpcode(int) 方法。
下面我们看一个列子:在企业级开发中,是不允许用System.out来输出信息的,必须要用log日志来打印出信息,所以我们就增加一个findbugs的新规则发现代码中有system.out的时候就给用户提示,一下是开发步骤
先看一段通过javap反编的java代码对比
源码:
Java代码
public class Test{ public static void main(String[] args){ String str="pass"; if(str.equals("pass")){ System.out.println("str is pass"); } } }
反编:
Java代码
Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2; //String pass 2: astore_1 3: aload_1 4: ldc #2; //String pass 6: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z 9: ifeq 20 12: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream; 15: ldc #5; //String str is pass 17: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 20: return }
通过反编的代码我们可以看到调用system.out.println的时候是通过
12: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
这句来执行的,所以我们只要找到getstatic指令,并判断方法调用是System.out就可以知道是用了System.out,就可以声明bug并且报告bug
findbugs代码
Java代码
package edu.umd.cs.findbugs.detect; 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; /** * @author bo * 这个规则类用于判断System.out和System.error这种情况 */ public class ForbiddenSystemClass extends OpcodeStackDetector { BugReporter bugReporter; public ForbiddenSystemClass(BugReporter bugReporter) { this.bugReporter = bugReporter; } /** * visit方法,在每次进入字节码方法的时候调用 * 在每次进入新方法的时候清空标志位 */ @Override public void visit(Code obj) { super.visit(obj); } /** * 每扫描一条字节码就会进入sawOpcode方法 * * @param seen 字节码的枚举值 */ @Override public void sawOpcode(int seen) { if (seen == GETSTATIC) { if (getClassConstantOperand().equals("java/lang/System") && (getNameConstantOperand().equals("out") || getNameConstantOperand().equals("error"))) { BugInstance bug = new BugInstance(this, "ALP_SYSTEMCLASS", NORMAL_PRIORITY).addClassAndMethod(this) .addSourceLine(this, getPC()); bug.addInt(getPC()); bugReporter.reportBug(bug); } } } }
new BugInstance(this, "ALP_SYSTEMCLASS", NORMAL_PRIORITY)
ALP_SYSTEMCLASS这个和findbugs.xml、message.xml中相对应
findbugs的新规则开发使用了visit模式,我们只需要实现visit方法sawOpcode方法即可,当然实现复杂功能,有不同的父类
在findbugs.xml中把自己的Detector 声明出来
Xml代码
<Detector class="edu.umd.cs.findbugs.detect.AlipayForbiddenSystemClass" speed="fast" reports="ALP_SYSTEMCLASS" hidden="false" />
message.xml
<Detector class="edu.umd.cs.findbugs.detect.ForbiddenSystemClass"> <Details> <!--[CDATA[ <p>线上代码不能出现System.out <p>请使用log日志形式打印 ]]> </Details> </Detector> <BugPattern type="ALP_ALIPAY_SYSTEMCLASS"> <ShortDescription>线上代码不能出现System.out</ShortDescription> <LongDescription>{1}线上代码不能出现System.out,请使用log形式输出</LongDescription> <Details> <![CDATA[ <p>不能使用System.out和System.err,请使用log</p> ]]--> </Details> </BugPattern>
这里配置错误的显示信息
最终把
java类、xml按照下面这个ant脚本的描述进行打包
<project name="findbugs-plugin" default="build"> <property name="FindBugs.home" value="D:/Program Files/eclipse/plugins/edu.umd.cs.findbugs.plugin.eclipse_1.3.8.20090315"></property>这里是你的eclipse中findbugs的路径 <target name="build"> <jar destfile="AlipayFindBugsRules.jar"> <fileset dir="bin"/> <fileset dir="src"/> <zipfileset dir="etc" includes="*.xml" prefix=""></zipfileset> </jar> <copy file="FindBugsRules.jar" todir="${FindBugs.home}/plugin" /> </target> </project>
命令行ant就打包了,把打好的jar包放到findbugs插件的plugin目录下,重启eclipse就可以使用新的规则了
相关文章推荐
- 详解eclipse插件findbugs新规则的开发过程
- 详解eclipse插件findbugs新规则的开发过程
- 详解eclipse插件findbugs新规则的开发过程
- 详解eclipse插件findbugs新规则的开发过程
- 详解eclipse插件findbugs新规则的开发过程
- Eclipse插件开发之FindBugs插件
- Eclipse插件开发之FindBugs插件
- Eclipse插件开发之FindBugs插件
- Eclipse插件开发过程小憩
- eclipse 开发sencha touch 项目及插件配置的全过程
- Eclipse插件开发之FindBugs插件
- Windows下Eclipse的Tomcat插件安装过程_Ealon的开发笔记
- Eclipse插件开发之FindBugs插件
- eclipse插件开发的发布过程中遇到的问题与解决方法总结
- CentOS6.5下如何正确下载、安装Intellij IDEA、Scala、Scala-intellij-bin插件、Scala IDE for Eclipse助推大数据开发(图文详解)
- Eclipse插件开发之FindBugs插件
- Eclipse插件开发之FindBugs插件
- Eclipse插件开发之FindBugs插件
- Eclipse插件开发之FindBugs插件
- 【eclipse插件开发实战】 Eclipse插件开发5——时间插件Timer开发实例详解