2015-05-20 8 views
5

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?

+0

PMD hat bereits [einen Detektor] (http://pmd.sourceforge.net/pmd-4.3.0/rules/logging-java.html#SystemPrintln), der dies tut. –

+2

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

Antwort

1

Der Fehler liegt an der Pakethierarchie. Meine Detektorklasse befand sich innerhalb des findbugs.custom.detector Pakets, aber als ich das Jar (mit Eclipse) erstellte, wählte ich nur die erforderlichen Dateien aus (findbugs.xml, messages.xml, detector class). Daher wurde die Paketinformation nicht in den Behälter aufgenommen. Unsere XML-Dateien lesen die Detektorklasse unter Verwendung des Attributs class des Tags Detector mit dem Wert findbugs.custom.detector.MyDetectorClass. Wenn also XML-Dateien versuchen, die Detektorklasse zu lesen, konnten sie das Paket nicht finden.

Um ein Jar mit den darin enthaltenen Paketinformationen zu erstellen, wählen Sie das gesamte Projekt aus und erstellen Sie dann ein JAR mit den erforderlichen Dateien.