edu.umd.cs.findbugs.visitclass
Class DismantleBytecode

java.lang.Object
  extended by edu.umd.cs.findbugs.visitclass.BetterVisitor
      extended by edu.umd.cs.findbugs.visitclass.PreorderVisitor
          extended by edu.umd.cs.findbugs.visitclass.DismantleBytecode
All Implemented Interfaces:
Constants2, org.apache.bcel.classfile.Visitor, org.apache.bcel.Constants
Direct Known Subclasses:
BytecodeScanningDetector, CloneIdiom

public abstract class DismantleBytecode
extends PreorderVisitor


Field Summary
protected  byte[] codeBytes
           
protected  org.apache.bcel.classfile.LineNumberTable lineNumberTable
           
static byte M_BR
           
static byte M_CP
           
static byte M_INT
          Meaning of bytecode operands
static byte M_PAD
           
static byte M_R
           
static byte M_UINT
           
 
Fields inherited from interface org.apache.bcel.Constants
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, 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_ANNOTATION_DEFAULT, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_PMG, ATTR_RUNTIMEINVISIBLE_ANNOTATIONS, ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS, ATTR_RUNTIMEVISIBLE_ANNOTATIONS, ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS, 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, MAJOR_1_4, MAJOR_1_5, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MINOR_1_4, MINOR_1_5, 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
DismantleBytecode()
           
 
Method Summary
 int getBranchFallThrough()
           
 int getBranchOffset()
           
 int getBranchTarget()
           
 java.lang.String getClassConstantOperand()
           
 int getCodeByte(int offset)
           
 org.apache.bcel.classfile.Constant getConstantRefOperand()
           
 int getDefaultSwitchOffset()
           
 java.lang.String getDottedClassConstantOperand()
          If the current opcode has a class operand, get the associated class constant, dot-formatted
 java.lang.String getDottedSigConstantOperand()
          If the current opcode has a reference constant operand, get its signature, dot-formatted
 int getIntConstant()
           
 int getMaxPC()
           
 java.lang.String getNameConstantOperand()
          If the current opcode has a reference constant operand, get its name
 int getNextPC()
           
 int getOpcode()
           
 int getPC()
           
 int getPrevOpcode(int offset)
          return previous opcode;
 java.lang.String getRefConstantOperand()
          If the current opcode has a reference constant operand, get its string representation
 boolean getRefFieldIsStatic()
           
 int getRegisterOperand()
           
 java.lang.String getSigConstantOperand()
          If the current opcode has a reference constant operand, get its signature, slash-formatted
 java.lang.String getStringConstantOperand()
          If the current opcode has a string constant operand, get its name
 int[] getSwitchLabels()
           
 int[] getSwitchOffsets()
           
static boolean isBranch(int opcode)
          Return whether or not given opcode is a branch instruction.
 boolean isRegisterLoad()
           
 boolean isRegisterStore()
           
static boolean isSwitch(int opcode)
          Return whether or not given opcode is a switch instruction.
 void printOpCode(int seen)
           
 void sawBranchTo(int seen)
           
 void sawClass()
           
 void sawDouble(double seen)
           
 void sawField()
           
 void sawFloat(float seen)
           
 void sawIMethod()
           
 void sawInt(int seen)
           
 void sawLong(long seen)
           
 void sawMethod()
           
 void sawOffset(int seen)
           
 void sawOpcode(int seen)
           
 void sawRegister(int r)
           
 void sawString(java.lang.String seen)
           
 void visit(org.apache.bcel.classfile.Code obj)
           
 
Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor
asUnsignedByte, doVisitMethod, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodName, getMethodSig, getPackageName, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getThisClass, setupVisitorForClass, visitAfter, visitCode, visitConstantPool, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable
 
Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor
report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitMethod, visitSignature, visitSourceFile, visitStackMap, visitStackMapEntry, visitSynthetic, visitUnknown
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

M_INT

public static final byte M_INT
Meaning of bytecode operands

See Also:
Constant Field Values

M_UINT

public static final byte M_UINT
See Also:
Constant Field Values

M_CP

public static final byte M_CP
See Also:
Constant Field Values

M_R

public static final byte M_R
See Also:
Constant Field Values

M_BR

public static final byte M_BR
See Also:
Constant Field Values

M_PAD

public static final byte M_PAD
See Also:
Constant Field Values

codeBytes

protected byte[] codeBytes

lineNumberTable

protected org.apache.bcel.classfile.LineNumberTable lineNumberTable
Constructor Detail

DismantleBytecode

public DismantleBytecode()
Method Detail

getDottedClassConstantOperand

public java.lang.String getDottedClassConstantOperand()
If the current opcode has a class operand, get the associated class constant, dot-formatted


getRefConstantOperand

public java.lang.String getRefConstantOperand()
If the current opcode has a reference constant operand, get its string representation


getNameConstantOperand

public java.lang.String getNameConstantOperand()
If the current opcode has a reference constant operand, get its name


getDottedSigConstantOperand

public java.lang.String getDottedSigConstantOperand()
If the current opcode has a reference constant operand, get its signature, dot-formatted


getSigConstantOperand

public java.lang.String getSigConstantOperand()
If the current opcode has a reference constant operand, get its signature, slash-formatted


getClassConstantOperand

public java.lang.String getClassConstantOperand()

getStringConstantOperand

public java.lang.String getStringConstantOperand()
If the current opcode has a string constant operand, get its name


getConstantRefOperand

public org.apache.bcel.classfile.Constant getConstantRefOperand()

isRegisterLoad

public boolean isRegisterLoad()

isRegisterStore

public boolean isRegisterStore()

getRegisterOperand

public int getRegisterOperand()

getIntConstant

public int getIntConstant()

getBranchOffset

public int getBranchOffset()

getBranchTarget

public int getBranchTarget()

getBranchFallThrough

public int getBranchFallThrough()

getDefaultSwitchOffset

public int getDefaultSwitchOffset()

getRefFieldIsStatic

public boolean getRefFieldIsStatic()

getPC

public int getPC()

getPrevOpcode

public int getPrevOpcode(int offset)
return previous opcode;

Parameters:
offset - 0 for current opcode, 1 for one before that, etc.

isBranch

public static boolean isBranch(int opcode)
Return whether or not given opcode is a branch instruction.

Parameters:
opcode - the opcode
Returns:
true if instruction is a branch, false if not

isSwitch

public static boolean isSwitch(int opcode)
Return whether or not given opcode is a switch instruction.

Parameters:
opcode - the opcode
Returns:
true if instruction is a switch, false if not

getSwitchOffsets

public int[] getSwitchOffsets()

getSwitchLabels

public int[] getSwitchLabels()

getMaxPC

public int getMaxPC()

getCodeByte

public int getCodeByte(int offset)

getOpcode

public int getOpcode()

visit

public void visit(org.apache.bcel.classfile.Code obj)
Overrides:
visit in class BetterVisitor

sawDouble

public void sawDouble(double seen)

sawFloat

public void sawFloat(float seen)

sawRegister

public void sawRegister(int r)

sawInt

public void sawInt(int seen)

sawLong

public void sawLong(long seen)

sawBranchTo

public void sawBranchTo(int seen)

sawOffset

public void sawOffset(int seen)

sawOpcode

public void sawOpcode(int seen)

sawString

public void sawString(java.lang.String seen)

sawField

public void sawField()

sawMethod

public void sawMethod()

sawIMethod

public void sawIMethod()

sawClass

public void sawClass()

printOpCode

public void printOpCode(int seen)

getNextPC

public int getNextPC()
Returns:
Returns the nextPC.