1 20 21 package edu.umd.cs.findbugs.detect; 22 23 24 import edu.umd.cs.findbugs.*; 25 import edu.umd.cs.findbugs.ba.AnalysisContext; 26 import org.apache.bcel.classfile.*; 27 28 public class UseObjectEquals extends BytecodeScanningDetector implements StatelessDetector { 29 private BugReporter bugReporter; 30 private OpcodeStack stack = new OpcodeStack(); 31 32 public UseObjectEquals(BugReporter bugReporter) { 33 this.bugReporter = bugReporter; 34 } 35 36 37 38 @Override 39 public void visit(Method obj) { 40 super.visit(obj); 41 stack.resetForMethodEntry(this); 42 } 43 44 @Override 45 public void sawOpcode(int seen) { 46 stack.mergeJumps(this); 47 if ((seen == INVOKEVIRTUAL) 48 && getNameConstantOperand().equals("equals") 49 && getSigConstantOperand().equals("(Ljava/lang/Object;)Z")) { 50 51 if (stack.getStackDepth() > 1) { 52 OpcodeStack.Item item1 = stack.getStackItem(1); 53 54 try { 55 JavaClass cls = item1.getJavaClass(); 56 57 if ((cls != null) && cls.isFinal()) { 58 if (item1.getSignature().equals("Ljava/lang/Class;")) 59 return; 60 String methodClassName = getClassConstantOperand(); 61 if (methodClassName.equals("java/lang/Object")) { 62 if (!AnalysisContext.currentAnalysisContext().isApplicationClass(cls)) 63 return; 64 65 bugReporter.reportBug(new BugInstance("UOE_USE_OBJECT_EQUALS", LOW_PRIORITY) 66 .addClassAndMethod(this) 67 .addSourceLine(this)); 68 } 69 } 70 } catch (ClassNotFoundException cnfe) { 71 bugReporter.reportMissingClass(cnfe); 73 } 74 } 75 } 76 77 stack.sawOpcode(this, seen); 78 } 79 } 80 81 | Popular Tags |