gpt4 book ai didi

java - 在 findbugs 中添加自定义检测器

转载 作者:搜寻专家 更新时间:2023-10-31 20:33:38 25 4
gpt4 key购买 nike

我正在尝试添加一个检测器来检测 System.out.println() 的出现。如 this 中所述发布后,我已经编写了检测器类、findbugs.xml 文件和 messages.xml 文件。我创建了一个 jar,其中包含我的检测器类、findbugs.xml 和 messages.xml 文件。我在我的 eclipse 环境中添加了这个 jar(window->preferences->java->findbugs->Plugins and misc.Settings)。但它显示无效条目。

检测器类:

    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>

我该如何纠正这个问题?

最佳答案

错误是因为包的层次结构。我的检测器类位于 findbugs.custom.detector 包内,但是当我创建 jar(使用 eclipse)时,我只选择了所需的文件(findbugs.xml、messages.xml、检测器类)。因此,包信息未包含在 jar 中。我们的 XML 文件使用 Detector 标签的属性 class 读取检测器类,该标签的值为 findbugs.custom.detector.MyDetectorClass。因此,当 XML 文件尝试读取检测器类时,它们找不到 findbugs.custom.detector 包。

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

关于java - 在 findbugs 中添加自定义检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30345188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com