1 19 20 package edu.umd.cs.findbugs.detect; 21 22 23 import edu.umd.cs.findbugs.*; 24 import edu.umd.cs.findbugs.ba.Hierarchy; 25 import org.apache.bcel.classfile.*; 26 27 public class StartInConstructor extends BytecodeScanningDetector implements StatelessDetector { 28 private BugReporter bugReporter; 29 30 public StartInConstructor(BugReporter bugReporter) { 31 this.bugReporter = bugReporter; 32 } 33 34 35 36 boolean isFinal; 37 38 @Override 39 public void visit(JavaClass obj) { 40 isFinal = (obj.getAccessFlags() & ACC_FINAL) != 0 41 || (obj.getAccessFlags() & ACC_PUBLIC) == 0; 42 } 43 44 @Override 45 public void visit(Code obj) { 46 if (getMethodName().equals("<init>")) super.visit(obj); 47 } 48 49 @Override 50 public void sawOpcode(int seen) { 51 if (!isFinal && seen == INVOKEVIRTUAL && getNameConstantOperand().equals("start") 52 && getSigConstantOperand().equals("()V")) { 53 try { 54 if (Hierarchy.isSubtype(getDottedClassConstantOperand(), "java.lang.Thread")) { 55 bugReporter.reportBug(new BugInstance(this, "SC_START_IN_CTOR", NORMAL_PRIORITY) 56 .addClassAndMethod(this) 57 .addCalledMethod(this) 58 .addSourceLine(this)); 59 } 60 } catch (ClassNotFoundException e) { 61 bugReporter.reportMissingClass(e); 62 } 63 } 64 } 65 } 66 | Popular Tags |