| 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.Code; 26 27 public class FindRunInvocations extends BytecodeScanningDetector implements StatelessDetector { 28 29 private BugReporter bugReporter; 30 private boolean alreadySawStart; 31 32 public FindRunInvocations(BugReporter bugReporter) { 33 this.bugReporter = bugReporter; 34 } 35 36 37 private boolean isThread(String clazz) { 38 try { 39 return Hierarchy.isSubtype(clazz, "java.lang.Thread"); 40 } catch (ClassNotFoundException e) { 41 bugReporter.reportMissingClass(e); 42 return false; 43 } 44 } 45 46 @Override  47 public void visit(Code obj) { 48 alreadySawStart = false; 49 super.visit(obj); 50 } 51 52 @Override  53 public void sawOpcode(int seen) { 54 if (alreadySawStart) return; 55 if ((seen == INVOKEVIRTUAL || seen == INVOKEINTERFACE) 56 && getSigConstantOperand().equals("()V") 57 && isThread(getDottedClassConstantOperand()) 58 ) { 59 if (getNameConstantOperand().equals("start")) 60 alreadySawStart = true; 61 else if (getNameConstantOperand().equals("run")) 62 bugReporter 63 .reportBug(new BugInstance(this, "RU_INVOKE_RUN", NORMAL_PRIORITY) 64 .addClassAndMethod(this) 65 .addSourceLine(this)); 66 } 67 } 68 } 69 | Popular Tags |