Package org.objectweb.asm.tree.analysis
Class Analyzer<V extends Value>
- java.lang.Object
-
- org.objectweb.asm.tree.analysis.Analyzer<V>
-
-
Field Summary
Fields Modifier and Type Field Description private Frame<V>[]
frames
The execution stack frames of the currently analyzed method (one per instruction index).private java.util.List<TryCatchBlockNode>[]
handlers
The exception handlers of the currently analyzed method (one list per instruction index).private boolean[]
inInstructionsToProcess
The instructions that remain to process (one boolean per instruction index).private InsnList
insnList
The instructions of the currently analyzed method.private int
insnListSize
The size ofinsnList
.private int[]
instructionsToProcess
The indices of the instructions that remain to process in the currently analyzed method.private Interpreter<V>
interpreter
The interpreter to use to symbolically interpret the bytecode instructions.private int
numInstructionsToProcess
The number of instructions that remain to process in the currently analyzed method.private Subroutine[]
subroutines
The subroutines of the currently analyzed method (one per instruction index).-
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM4, ASM5, ASM6, ASM7, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, 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, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V9
-
-
Constructor Summary
Constructors Constructor Description Analyzer(Interpreter<V> interpreter)
Constructs a newAnalyzer
.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Frame<V>[]
analyze(java.lang.String owner, MethodNode method)
Analyzes the given method.private Frame<V>
computeInitialFrame(java.lang.String owner, MethodNode method)
Computes the initial execution stack frame of the given method.private void
findSubroutine(int insnIndex, Subroutine subroutine, java.util.List<AbstractInsnNode> jsrInsns)
Follows the control flow graph of the currently analyzed method, starting at the given instruction index, and stores a copy of the given subroutine insubroutines
for each encountered instruction.Frame<V>[]
getFrames()
Returns the symbolic execution stack frame for each instruction of the last analyzed method.java.util.List<TryCatchBlockNode>
getHandlers(int insnIndex)
Returns the exception handlers for the given instruction.protected void
init(java.lang.String owner, MethodNode method)
Initializes this analyzer.private void
merge(int insnIndex, Frame<V> frameBeforeJsr, Frame<V> frameAfterRet, Subroutine subroutineBeforeJsr, boolean[] localsUsed)
Merges the given frame and subroutine into the frame and subroutines at the given instruction index (case of a RET instruction).private void
merge(int insnIndex, Frame<V> frame, Subroutine subroutine)
Merges the given frame and subroutine into the frame and subroutines at the given instruction index.protected void
newControlFlowEdge(int insnIndex, int successorIndex)
Creates a control flow graph edge.protected boolean
newControlFlowExceptionEdge(int insnIndex, int successorIndex)
Creates a control flow graph edge corresponding to an exception handler.protected boolean
newControlFlowExceptionEdge(int insnIndex, TryCatchBlockNode tryCatchBlock)
Creates a control flow graph edge corresponding to an exception handler.protected Frame<V>
newFrame(int numLocals, int numStack)
Constructs a new frame with the given size.protected Frame<V>
newFrame(Frame<? extends V> frame)
Constructs a copy of the given frame.
-
-
-
Field Detail
-
interpreter
private final Interpreter<V extends Value> interpreter
The interpreter to use to symbolically interpret the bytecode instructions.
-
insnList
private InsnList insnList
The instructions of the currently analyzed method.
-
insnListSize
private int insnListSize
The size ofinsnList
.
-
handlers
private java.util.List<TryCatchBlockNode>[] handlers
The exception handlers of the currently analyzed method (one list per instruction index).
-
frames
private Frame<V extends Value>[] frames
The execution stack frames of the currently analyzed method (one per instruction index).
-
subroutines
private Subroutine[] subroutines
The subroutines of the currently analyzed method (one per instruction index).
-
inInstructionsToProcess
private boolean[] inInstructionsToProcess
The instructions that remain to process (one boolean per instruction index).
-
instructionsToProcess
private int[] instructionsToProcess
The indices of the instructions that remain to process in the currently analyzed method.
-
numInstructionsToProcess
private int numInstructionsToProcess
The number of instructions that remain to process in the currently analyzed method.
-
-
Constructor Detail
-
Analyzer
public Analyzer(Interpreter<V> interpreter)
Constructs a newAnalyzer
.- Parameters:
interpreter
- the interpreter to use to symbolically interpret the bytecode instructions.
-
-
Method Detail
-
analyze
public Frame<V>[] analyze(java.lang.String owner, MethodNode method) throws AnalyzerException
Analyzes the given method.- Parameters:
owner
- the internal name of the class to which 'method' belongs.method
- the method to be analyzed.- Returns:
- the symbolic state of the execution stack frame at each bytecode instruction of the method. The size of the returned array is equal to the number of instructions (and labels) of the method. A given frame is null if and only if the corresponding instruction cannot be reached (dead code).
- Throws:
AnalyzerException
- if a problem occurs during the analysis.
-
findSubroutine
private void findSubroutine(int insnIndex, Subroutine subroutine, java.util.List<AbstractInsnNode> jsrInsns) throws AnalyzerException
Follows the control flow graph of the currently analyzed method, starting at the given instruction index, and stores a copy of the given subroutine insubroutines
for each encountered instruction. Jumps to nested subroutines are not followed: instead, the corresponding instructions are put in the given list.- Parameters:
insnIndex
- an instruction index.subroutine
- a subroutine.jsrInsns
- where the jsr instructions for nested subroutines must be put.- Throws:
AnalyzerException
- if the control flow graph can fall off the end of the code.
-
computeInitialFrame
private Frame<V> computeInitialFrame(java.lang.String owner, MethodNode method)
Computes the initial execution stack frame of the given method.- Parameters:
owner
- the internal name of the class to which 'method' belongs.method
- the method to be analyzed.- Returns:
- the initial execution stack frame of the 'method'.
-
getFrames
public Frame<V>[] getFrames()
Returns the symbolic execution stack frame for each instruction of the last analyzed method.- Returns:
- the symbolic state of the execution stack frame at each bytecode instruction of the method. The size of the returned array is equal to the number of instructions (and labels) of the method. A given frame is null if the corresponding instruction cannot be reached, or if an error occurred during the analysis of the method.
-
getHandlers
public java.util.List<TryCatchBlockNode> getHandlers(int insnIndex)
Returns the exception handlers for the given instruction.- Parameters:
insnIndex
- the index of an instruction of the last analyzed method.- Returns:
- a list of
TryCatchBlockNode
objects.
-
init
protected void init(java.lang.String owner, MethodNode method) throws AnalyzerException
Initializes this analyzer. This method is called just before the execution of control flow analysis loop in #analyze. The default implementation of this method does nothing.- Parameters:
owner
- the internal name of the class to which the method belongs.method
- the method to be analyzed.- Throws:
AnalyzerException
- if a problem occurs.
-
newFrame
protected Frame<V> newFrame(int numLocals, int numStack)
Constructs a new frame with the given size.- Parameters:
numLocals
- the maximum number of local variables of the frame.numStack
- the maximum stack size of the frame.- Returns:
- the created frame.
-
newFrame
protected Frame<V> newFrame(Frame<? extends V> frame)
Constructs a copy of the given frame.- Parameters:
frame
- a frame.- Returns:
- the created frame.
-
newControlFlowEdge
protected void newControlFlowEdge(int insnIndex, int successorIndex)
Creates a control flow graph edge. The default implementation of this method does nothing. It can be overridden in order to construct the control flow graph of a method (this method is called by theanalyze(java.lang.String, org.objectweb.asm.tree.MethodNode)
method during its visit of the method's code).- Parameters:
insnIndex
- an instruction index.successorIndex
- index of a successor instruction.
-
newControlFlowExceptionEdge
protected boolean newControlFlowExceptionEdge(int insnIndex, int successorIndex)
Creates a control flow graph edge corresponding to an exception handler. The default implementation of this method does nothing. It can be overridden in order to construct the control flow graph of a method (this method is called by theanalyze(java.lang.String, org.objectweb.asm.tree.MethodNode)
method during its visit of the method's code).- Parameters:
insnIndex
- an instruction index.successorIndex
- index of a successor instruction.- Returns:
- true if this edge must be considered in the data flow analysis performed by this analyzer, or false otherwise. The default implementation of this method always returns true.
-
newControlFlowExceptionEdge
protected boolean newControlFlowExceptionEdge(int insnIndex, TryCatchBlockNode tryCatchBlock)
Creates a control flow graph edge corresponding to an exception handler. The default implementation of this method delegates tonewControlFlowExceptionEdge(int, int)
. It can be overridden in order to construct the control flow graph of a method (this method is called by theanalyze(java.lang.String, org.objectweb.asm.tree.MethodNode)
method during its visit of the method's code).- Parameters:
insnIndex
- an instruction index.tryCatchBlock
- TryCatchBlockNode corresponding to this edge.- Returns:
- true if this edge must be considered in the data flow analysis performed by this
analyzer, or false otherwise. The default implementation of this method delegates to
newControlFlowExceptionEdge(int, int)
.
-
merge
private void merge(int insnIndex, Frame<V> frame, Subroutine subroutine) throws AnalyzerException
Merges the given frame and subroutine into the frame and subroutines at the given instruction index. If the frame or the subroutine at the given instruction index changes as a result of this merge, the instruction index is added to the list of instructions to process (if it is not already the case).- Parameters:
insnIndex
- an instruction index.frame
- a frame. This frame is left unchanged by this method.subroutine
- a subroutine. This subroutine is left unchanged by this method.- Throws:
AnalyzerException
- if the frames have incompatible sizes.
-
merge
private void merge(int insnIndex, Frame<V> frameBeforeJsr, Frame<V> frameAfterRet, Subroutine subroutineBeforeJsr, boolean[] localsUsed) throws AnalyzerException
Merges the given frame and subroutine into the frame and subroutines at the given instruction index (case of a RET instruction). If the frame or the subroutine at the given instruction index changes as a result of this merge, the instruction index is added to the list of instructions to process (if it is not already the case).- Parameters:
insnIndex
- the index of an instruction immediately following a jsr instruction.frameBeforeJsr
- the execution stack frame before the jsr instruction. This frame is merged into 'frameAfterRet'.frameAfterRet
- the execution stack frame after a ret instruction of the subroutine. This frame is merged into the frame at 'insnIndex' (after it has itself been merge with 'frameBeforeJsr').subroutineBeforeJsr
- if the jsr is itself part of a subroutine (case of nested subroutine), the subroutine it belongs to.localsUsed
- the local variables read or written in the subroutine.- Throws:
AnalyzerException
- if the frames have incompatible sizes.
-
-