1 package edu.umd.cs.findbugs.detect; 2 3 4 import edu.umd.cs.findbugs.*; 5 6 import org.apache.bcel.classfile.Method; 7 8 public class IDivResultCastToDouble extends BytecodeScanningDetector { 9 private static final boolean DEBUG = SystemProperties.getBoolean("idcd.debug"); 10 11 private BugReporter bugReporter; 12 private int prevOpCode; 13 14 public IDivResultCastToDouble(BugReporter bugReporter) { 15 this.bugReporter = bugReporter; 16 } 17 18 19 @Override 20 public void visit(Method obj) { 21 if (DEBUG) System.out.println("Visiting " + obj); 22 } 23 24 BugInstance pendingBug = null; 25 @Override 26 public void sawOpcode(int seen) { 27 28 if (DEBUG) System.out.println("Saw opcode " + OPCODE_NAMES[seen] + " " + pendingBug); 29 30 31 32 if ((prevOpCode == I2D || prevOpCode == L2D) 33 && seen == INVOKESTATIC 34 && getClassConstantOperand().equals("java/lang/Math") 35 && getNameConstantOperand().equals("ceil")) { 36 bugReporter.reportBug(new BugInstance(this, 37 "ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL", 38 HIGH_PRIORITY) 39 .addClassAndMethod(this) 40 .addSourceLine(this)); 41 pendingBug = null; 42 } 43 else if ((prevOpCode == I2F || prevOpCode == L2F) 44 && seen == INVOKESTATIC 45 && getClassConstantOperand().equals("java/lang/Math") 46 && getNameConstantOperand().equals("round")) { 47 bugReporter.reportBug(new BugInstance(this, 48 "ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND", 49 HIGH_PRIORITY) 50 .addClassAndMethod(this) 51 .addSourceLine(this)); 52 pendingBug = null; 53 } 54 else if (pendingBug != null) { 55 bugReporter.reportBug(pendingBug); 56 pendingBug = null; 57 } 58 59 if (prevOpCode == IDIV && (seen == I2D|| seen == I2F) 60 || prevOpCode == LDIV && (seen == L2D || seen==L2F)) 61 pendingBug = new BugInstance(this, "ICAST_IDIV_CAST_TO_DOUBLE", NORMAL_PRIORITY) 62 .addClassAndMethod(this) 63 .addSourceLine(this); 64 65 prevOpCode = seen; 66 } 67 } 68 | Popular Tags |