标签: findbugs

自定义findBugs检测器

1.java 检测类 继承?OpcodeStackDetector

public class SysoutDetector extends OpcodeStackDetector {

BugReporter bugReporter;

public SysoutDetector(BugReporter bugReporter) {

this.bugReporter = bugReporter;

}

@Override

public void sawOpcode(int seen) {

if (seen == GETSTATIC) {

if (getClassConstantOperand().equals(“java/lang/System”)// get class mapping

&& (getNameConstantOperand().equals(“out”))) {

BugInstance bug = new BugInstance(this, “CHECK_SYSTEMCLASS”, NORMAL_PRIORITY).addClassAndMethod(this).addSourceLine(this, getPC());

bug.addInt(getPC());

bugReporter.reportBug(bug);

}

}

}

}

BugInstance 的type参数 为 messages.xml中发布的?<BugPattern type=”CHECK_SYSTEMCLASS”>

2.更改messages.xml

注册

<BugPattern type=”CHECK_SYSTEMCLASS”>

<ShortDescription>使用了System.out </ShortDescription>

<LongDescription>checks {1} method.Changes to logger if needed.</LongDescription>

<Details>

<![CDATA[

<p>system class used.

</p>

]]>

</Details>

该 ?BugPattern 的?ShortDescription 为findbugs静态检测后bug exlpoer 中的bug 节点名称

注册?<Detector class=”edu.umd.cs.findbugs.detect. SysoutDetector “>

<Details>

<![CDATA[

<p>Checks for classes used System class. </p>

]]>

</Details>

</Detector>

注册?<BugCode abbrev=”CUSTOM”>System class used</BugCode> ,注册一个自己的bugCode,意义不大,如果自己不注册一个,

findbugs.xml中 abbrev值就要使用系统的

3.修改findbugs.xml 文件

注册 <BugPattern abbrev=”CUSTOM” type=”CHECK_SYSTEMCLASS” category=”EXPERIMENTAL” />

此意: ?CHECK_SYSTEMCLASS 为?EXPERIMENTAL 下检测器,

EXPERIMENTAL 在Myeclispe/window/preferences/java/findbugs 中勾选

注册<Detector class=”edu.umd.cs.findbugs.detect.SysoutDetector”

speed=”fast” reports=”CHECK_SYSTEMCLASS” hidden=”false”/>

4.发布

找到findbugs的Myeclipse插件目录,找到?findbugs-plugin.jar

替换其下的findbugs.xml 和 messages.xml,以及加入新的class文件。重启Myeclipse即可。

使用FindBugs插件提高代码质量和在重构中发现问题

FindBugs 是什么?

FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。之所以叫做静态分析工具,是因为它在不实际运行程序的情况对软件进行分析。使用findbugs有很多种方式,从 GUI、从命令行、使用 Ant、作为 Eclipse 插件程序和使用 Maven,甚至作为hudson持续集成的插件。FindBugs发现的不是引起编译错误的bugs,它只检查一些不好的编程习惯、检测系统潜在的性能和并发等问题。

findbugs自己定义了一系列的检测器,1.3.9版本的检测器有83种Bad practice(不好的习惯),133种Correctness(正确性),2种Experimental(实验性问题),1种 Internationalization(国际化问题),12种Malicious code vulnerability(恶意的代码),41种Multithreaded correctness(线程问题),27种Performance(性能问题),9种Security(安全性问题),62种Dodgy(狡猾的问题)。

安装方法(插件在附件中)

直接解压放到myeclipse\eclipse\plugins下

举例

在PivotServlet..java右击FindBugs—>FindBugs;插件会根据预先定义好的检测器,查找问题。

1、 在循环中使用“+”号连接字符串(Method concatenates strings using + in a loop)

下方会提示问题产生原因,并给出修改建议还有代码示例(英文很简单、不懂的单词查下即可)

2、 静态变量问题(Write to static field from instance method)

edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821