Ich versuche, einen Detektor hinzuzufügen, der System.out.println() auftritt. Wie in this Beitrag erläutert, habe ich die Detektorklasse, findbugs.xml-Datei und messages.xml-Datei geschrieben. Ich habe ein Jar erstellt, das meine Detektorklasse, findbugs.xml und messages.xml Dateien enthält. Ich habe dieses jar in meiner Eclipse-Umgebung hinzugefügt (window-> preferences-> java-> findbugs-> Plugins and misc. Settings). Aber es zeigt ungültigen Eintrag.Hinzufügen von benutzerdefinierten Detektoren in Findbugs
Detector Klasse:
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 Datei:
<FindbugsPlugin>
<Detector class="findbugs.custom.detector.CallToSystemOutPrintlnDetector2" speed="fast" />
<BugPattern abbrev="SYS_OUT_P" type="CALL_TO_SYSTEM_OUT" category="CORRECTNESS" />
</FindbugsPlugin>
messages.xml Datei:
<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>
Wie kann ich das korrigieren?
PMD hat bereits [einen Detektor] (http://pmd.sourceforge.net/pmd-4.3.0/rules/logging-java.html#SystemPrintln), der dies tut. –
Aber soweit ich weiß, arbeitet PMD am Quellcode und Findbugs arbeitet an Bytecode. Mein Ziel war es nicht, einen Detektor zum Erkennen von System.out.print zu schreiben, sondern zu verstehen, wie man einen Detektor mit Bytecode schreibt und ihn zu Findbugs hinzufügt. – Manoj