edu.umd.cs.findbugs
Class OpcodeStack

java.lang.Object
  extended by edu.umd.cs.findbugs.OpcodeStack
All Implemented Interfaces:
Constants2, org.apache.bcel.Constants

public class OpcodeStack
extends java.lang.Object
implements Constants2

tracks the types and numbers of objects that are currently on the operand stack throughout the execution of method. To use, a detector should instantiate one for each method, and call

stack.sawOpcode(this,seen);

at the bottom of their sawOpcode method. at any point you can then inspect the stack and see what the types of objects are on the stack, including constant values if they were pushed. The types described are of course, only the static types. There are some outstanding opcodes that have yet to be implemented, I couldn't find any code that actually generated these, so i didn't put them in because I couldn't test them:


Nested Class Summary
static class OpcodeStack.Item
           
 
Field Summary
private static boolean DEBUG
           
private  java.util.List<OpcodeStack.Item> lvValues
           
private  java.util.List<OpcodeStack.Item> stack
           
 
Fields inherited from interface org.apache.bcel.Constants
AALOAD, AASTORE, ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_PMG, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_Long, CONSTANT_Methodref, CONSTANT_NameAndType, CONSTANT_NAMES, CONSTANT_String, CONSTANT_Utf8, CONSTRUCTOR_NAME, CONSUME_STACK, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DLOAD_0, DLOAD_1, DLOAD_2, DLOAD_3, DMUL, DNEG, DREM, DRETURN, DSTORE, DSTORE_0, DSTORE_1, DSTORE_2, DSTORE_3, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAD_0, FLOAD_1, FLOAD_2, FLOAD_3, FMUL, FNEG, FREM, FRETURN, FSTORE, FSTORE_0, FSTORE_1, FSTORE_2, FSTORE_3, FSUB, GETFIELD, GETFIELD_QUICK, GETFIELD_QUICK_W, GETFIELD2_QUICK, GETSTATIC, GETSTATIC_QUICK, GETSTATIC2_QUICK, GOTO, GOTO_W, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILLEGAL_OPCODE, ILLEGAL_TYPE, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMPDEP1, IMPDEP2, IMUL, INEG, INSTANCEOF, INSTANCEOF_QUICK, INT2BYTE, INT2CHAR, INT2SHORT, INTERFACES_IMPLEMENTED_BY_ARRAYS, INVOKEINTERFACE, INVOKEINTERFACE_QUICK, INVOKENONVIRTUAL, INVOKENONVIRTUAL_QUICK, INVOKESPECIAL, INVOKESTATIC, INVOKESTATIC_QUICK, INVOKESUPER_QUICK, INVOKEVIRTUAL, INVOKEVIRTUAL_QUICK, INVOKEVIRTUAL_QUICK_W, INVOKEVIRTUALOBJECT_QUICK, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, ITEM_Bogus, ITEM_Double, ITEM_Float, ITEM_InitObject, ITEM_Integer, ITEM_Long, ITEM_NAMES, ITEM_NewObject, ITEM_Null, ITEM_Object, IUSHR, IXOR, JSR, JSR_W, KNOWN_ATTRIBUTES, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_QUICK, LDC_W, LDC_W_QUICK, LDC2_W, LDC2_W_QUICK, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LXOR, MAJOR, MAJOR_1_1, MAJOR_1_2, MAJOR_1_3, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, MULTIANEWARRAY_QUICK, NEW, NEW_QUICK, NEWARRAY, NO_OF_OPERANDS, NOP, OPCODE_NAMES, POP, POP2, PRODUCE_STACK, PUSH, PUTFIELD, PUTFIELD_QUICK, PUTFIELD_QUICK_W, PUTFIELD2_QUICK, PUTSTATIC, PUTSTATIC_QUICK, PUTSTATIC2_QUICK, RESERVED, RET, RETURN, SALOAD, SASTORE, SHORT_TYPE_NAMES, SIPUSH, STATIC_INITIALIZER_NAME, SWAP, SWITCH, T_ADDRESS, T_ARRAY, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_OBJECT, T_REFERENCE, T_SHORT, T_UNKNOWN, T_VOID, TABLESWITCH, TYPE_NAMES, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE, WIDE
 
Constructor Summary
OpcodeStack()
           
 
Method Summary
private  OpcodeStack.Item getLVValue(int index)
           
 int getStackDepth()
           
 OpcodeStack.Item getStackItem(int stackOffset)
           
private  java.lang.String getStringFromIndex(DismantleBytecode dbc, int i)
           
private  OpcodeStack.Item pop()
           
private  void pop(int count)
           
private  void push(OpcodeStack.Item i)
           
private  void pushByConstant(DismantleBytecode dbc, org.apache.bcel.classfile.Constant c)
           
private  void pushByDoubleMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
           
private  void pushByFloatMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
           
private  void pushByIntMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
           
private  void pushByInvoke(DismantleBytecode dbc, boolean popThis)
           
private  void pushByLocalLoad(java.lang.String signature, int register)
           
private  void pushByLocalObjectLoad(DismantleBytecode dbc, int register)
           
private  void pushByLocalStore(int register)
           
private  void pushByLongMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
           
private  void pushBySignature(java.lang.String s)
           
 void sawOpcode(DismantleBytecode dbc, int seen)
           
private  void setLVValue(int index, OpcodeStack.Item value)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEBUG

private static final boolean DEBUG

stack

private java.util.List<OpcodeStack.Item> stack

lvValues

private java.util.List<OpcodeStack.Item> lvValues
Constructor Detail

OpcodeStack

public OpcodeStack()
Method Detail

sawOpcode

public void sawOpcode(DismantleBytecode dbc,
                      int seen)

getStackDepth

public int getStackDepth()

getStackItem

public OpcodeStack.Item getStackItem(int stackOffset)

pop

private OpcodeStack.Item pop()

pop

private void pop(int count)

push

private void push(OpcodeStack.Item i)

pushByConstant

private void pushByConstant(DismantleBytecode dbc,
                            org.apache.bcel.classfile.Constant c)

pushByLocalObjectLoad

private void pushByLocalObjectLoad(DismantleBytecode dbc,
                                   int register)

pushByIntMath

private void pushByIntMath(int seen,
                           OpcodeStack.Item it,
                           OpcodeStack.Item it2)

pushByLongMath

private void pushByLongMath(int seen,
                            OpcodeStack.Item it,
                            OpcodeStack.Item it2)

pushByFloatMath

private void pushByFloatMath(int seen,
                             OpcodeStack.Item it,
                             OpcodeStack.Item it2)

pushByDoubleMath

private void pushByDoubleMath(int seen,
                              OpcodeStack.Item it,
                              OpcodeStack.Item it2)

pushByInvoke

private void pushByInvoke(DismantleBytecode dbc,
                          boolean popThis)

getStringFromIndex

private java.lang.String getStringFromIndex(DismantleBytecode dbc,
                                            int i)

pushBySignature

private void pushBySignature(java.lang.String s)

pushByLocalStore

private void pushByLocalStore(int register)

pushByLocalLoad

private void pushByLocalLoad(java.lang.String signature,
                             int register)

setLVValue

private void setLVValue(int index,
                        OpcodeStack.Item value)

getLVValue

private OpcodeStack.Item getLVValue(int index)