在findbugs中添加自定义检测器

时间:2015-05-20 09:09:47

标签: java findbugs

我正在尝试添加一个检测器,它将检测System.out.println()的出现次数。正如this帖子中所解释的,我编写了探测器类,findbugs.xml文件和messages.xml文件。 我创建了一个包含我的探测器类,findbugs.xml和messages.xml文件的jar。我在我的eclipse环境中添加了这个jar(window-> preferences-> java-> findbugs->插件和misc。设置)。但它显示无效输入。

探测器类:

    package findbugs.custom.detector;
    import edu.umd.cs.findbugs.BugInstance;
    import edu.umd.cs.findbugs.BugReporter;
    import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;
    import edu.umd.cs.findbugs.classfile.ClassDescriptor;
    import edu.umd.cs.findbugs.classfile.FieldDescriptor;
    public class CallToSystemOutPrintlnDetector2 extends OpcodeStackDetector {


private BugReporter bugReporter;


public CallToSystemOutPrintlnDetector2(BugReporter bugReporter) {
    super();
    this.bugReporter = bugReporter;

}


public void sawOpcode(int seen) {
    if (seen == GETSTATIC){

        try {
            FieldDescriptor operand = getFieldDescriptorOperand();
            ClassDescriptor classDescriptor = operand.getClassDescriptor();
            if ("java/lang/System".equals(classDescriptor.getClassName()) && 
                    ("err".equals(operand.getName())||"out".equals(operand.getName()))) {
                reportBug();
            }
        } catch (Exception e) {
            //ignore
        }
    }
}

private void reportBug(){
    this.bugReporter.reportBug(getBugInstance());
}


private BugInstance getBugInstance() {
    return new BugInstance(this, "MY_CALL_TO_SYSTEM_OUT_BUG", 10)
        .addClassAndMethod(this)
        .addSourceLine(this);
}
}

findbugs.xml文件:

    <FindbugsPlugin>
    <Detector class="findbugs.custom.detector.CallToSystemOutPrintlnDetector2" speed="fast" />
    <BugPattern abbrev="SYS_OUT_P" type="CALL_TO_SYSTEM_OUT" category="CORRECTNESS" />
    </FindbugsPlugin>

messages.xml文件:

    <MessageCollection>
    <Detector class="findbugs.custom.detector.CallToSystemOutPrintlnDetector2">
    <Details>
    <![CDATA[
    <p>This detector warns about SYS_OUTs used in the code. It is a fast detector.</p>
    ]]>
    </Details>
    </Detector>
    <BugPattern type="CALL_TO_SYSTEM_OUT_BUG">
    <ShortDescription>sysout detector</ShortDescription>
    <LongDescription>Found sysout in {1}</LongDescription>
    <Details>
    <![CDATA[
    <p>This is a call to System.out.println/err method. </p>
    which should be avoided.
    ]]>
    </Details>
    </BugPattern>
    <BugCode abbrev="SYS_OUT_P">Found sysout</BugCode>
    </MessageCollection>

我该如何纠正?

1 个答案:

答案 0 :(得分:1)

错误是由于包层次结构。我的探测器类在findbugs.custom.detector包内,但是当我创建jar(使用eclipse)时,我只选择了所需的文件(findbugs.xml,messages.xml,detector class)。 因此包装信息不包含在罐子里。我们的XML文件使用值为class的{​​{1}}标记的属性Detector读取检测器类。 因此,当XML文件尝试读取检测器类时,他们找不到findbugs.custom.detector.MyDetectorClass包。

要构建包含包信息的jar,选择整个项目,然后创建一个包含所需文件的jar。