Package edu.umd.cs.findbugs.visitclass
Class DismantleBytecode
- java.lang.Object
-
- edu.umd.cs.findbugs.visitclass.BetterVisitor
-
- edu.umd.cs.findbugs.visitclass.PreorderVisitor
-
- edu.umd.cs.findbugs.visitclass.AnnotationVisitor
-
- edu.umd.cs.findbugs.visitclass.DismantleBytecode
-
- All Implemented Interfaces:
Constants2,org.apache.bcel.classfile.Visitor,org.apache.bcel.Constants
- Direct Known Subclasses:
BytecodeScanningDetector,CloneIdiom,NoteDirectlyRelevantTypeQualifiers
public abstract class DismantleBytecode extends AnnotationVisitor
-
-
Field Summary
Fields Modifier and Type Field Description protected byte[]codeBytesprotected org.apache.bcel.classfile.LineNumberTablelineNumberTablestatic byteM_BRstatic byteM_CPstatic byteM_INTMeaning of bytecode operandsstatic byteM_PADstatic byteM_Rstatic byteM_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_SYPER, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, APPEND_FRAME, APPEND_FRAME_MAX, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_ANNOTATION_DEFAULT, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_ENCLOSING_METHOD, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_LOCAL_VARIABLE_TYPE_TABLE, ATTR_PMG, ATTR_RUNTIME_VISIBLE_ANNOTATIONS, ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_STACK_MAP_TABLE, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CHOP_FRAME, CHOP_FRAME_MAX, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_Methodref, CONSTANT_MethodType, 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, FULL_FRAME, 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, INVOKEDYNAMIC, 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, MAJOR_1_6, MAJOR_1_7, MAJOR_1_8, 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, MINOR_1_6, MINOR_1_7, MINOR_1_8, 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, SAME_FRAME, SAME_FRAME_EXTENDED, SAME_FRAME_MAX, SAME_LOCALS_1_STACK_ITEM_FRAME, SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED, SAME_LOCALS_1_STACK_ITEM_FRAME_MAX, 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
Constructors Constructor Description DismantleBytecode()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description voidafterOpcode(int seen)static booleanareOppositeBranches(int opcode1, int opcode2)booleanatCatchBlock()booleanbeforeOpcode(int seen)return false if we should skip calling sawOpcodeintgetBranchFallThrough()intgetBranchOffset()intgetBranchTarget()java.lang.StringgetClassConstantOperand()If the current opcode has a class constant operand, get the classname, slash-formatted.ClassDescriptorgetClassDescriptorOperand()intgetCodeByte(int offset)org.apache.bcel.classfile.ConstantgetConstantRefOperand()intgetDefaultSwitchOffset()java.lang.StringgetDottedClassConstantOperand()If the current opcode has a class operand, get the associated class constant, dot-formattedFieldDescriptorgetFieldDescriptorOperand()intgetIntConstant()longgetLongConstant()intgetMaxPC()MethodDescriptorgetMethodDescriptorOperand()java.lang.StringgetNameConstantOperand()If the current opcode has a reference constant operand, get its nameintgetNextCodeByte(int offset)intgetNextOpcode()intgetNextPC()intgetOpcode()intgetPC()intgetPrevOpcode(int offset)return previous opcode;java.lang.StringgetRefConstantOperand()Deprecated.booleangetRefFieldIsStatic()intgetRegisterOperand()java.lang.StringgetSigConstantOperand()If the current opcode has a reference constant operand, get its signature, slash-formattedjava.lang.StringgetStringConstantOperand()If the current opcode has a string constant operand, get its nameint[]getSwitchLabels()int[]getSwitchOffsets()XClassgetXClassOperand()XFieldgetXFieldOperand()XMethodgetXMethodOperand()static booleanisBranch(int opcode)Return whether or not given opcode is a branch instruction.booleanisMethodCall()booleanisRegisterLoad()booleanisRegisterStore()booleanisRegisterStore(int opcode)booleanisReturn(int opcode)booleanisShift(int opcode)static booleanisSwitch(int opcode)Return whether or not given opcode is a switch instruction.booleanisWideOpcode()voidprintOpCode(int seen)voidsawBranchTo(int targetPC)voidsawClass()voidsawDouble(double seen)voidsawField()voidsawFloat(float seen)voidsawIMethod()voidsawInt(int seen)voidsawLong(long seen)voidsawMethod()voidsawOpcode(int seen)voidsawRegister(int r)voidsawString(java.lang.String seen)voidvisit(org.apache.bcel.classfile.Code obj)-
Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor
getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor
amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitCode, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitStackMapTable, visitStackMapTableEntry
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor
clone, 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, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitMethod, visitSignature, visitSourceFile, visitStackMap, visitStackMapEntry, visitSynthetic, visitUnknown
-
-
-
-
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
-
-
Method Detail
-
getClassDescriptorOperand
public ClassDescriptor getClassDescriptorOperand()
-
getXClassOperand
@CheckForNull public XClass getXClassOperand()
-
isMethodCall
public boolean isMethodCall()
-
getMethodDescriptorOperand
public MethodDescriptor getMethodDescriptorOperand()
-
getXMethodOperand
@CheckForNull public XMethod getXMethodOperand()
-
getFieldDescriptorOperand
public FieldDescriptor getFieldDescriptorOperand()
-
getXFieldOperand
@CheckForNull public XField getXFieldOperand()
-
getDottedClassConstantOperand
public java.lang.String getDottedClassConstantOperand()
If the current opcode has a class operand, get the associated class constant, dot-formatted
-
getRefConstantOperand
@Deprecated public java.lang.String getRefConstantOperand()
Deprecated.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
-
getSigConstantOperand
public java.lang.String getSigConstantOperand()
If the current opcode has a reference constant operand, get its signature, slash-formatted
-
getClassConstantOperand
@SlashedClassName public java.lang.String getClassConstantOperand()
If the current opcode has a class constant operand, get the classname, slash-formatted.
-
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()
-
getLongConstant
public long getLongConstant()
-
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.
-
isWideOpcode
public boolean isWideOpcode()
-
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()
-
atCatchBlock
public boolean atCatchBlock()
-
visit
public void visit(org.apache.bcel.classfile.Code obj)
- Overrides:
visitin classBetterVisitor
-
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 targetPC)
-
beforeOpcode
public boolean beforeOpcode(int seen)
return false if we should skip calling sawOpcode
-
afterOpcode
public void afterOpcode(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.
-
getNextOpcode
public int getNextOpcode()
-
getNextCodeByte
public int getNextCodeByte(int offset)
-
isReturn
public boolean isReturn(int opcode)
-
isShift
public boolean isShift(int opcode)
-
areOppositeBranches
public static boolean areOppositeBranches(int opcode1, int opcode2)
-
isRegisterStore
public boolean isRegisterStore(int opcode)
-
-