org.objectweb.asm.tree.analysis
Class Analyzer

java.lang.Object
  extended by org.objectweb.asm.tree.analysis.Analyzer
All Implemented Interfaces:
Opcodes

public class Analyzer
extends java.lang.Object
implements Opcodes

A semantic bytecode analyzer. This class does not fully check that JSR and RET instructions are valid.

Author:
Eric Bruneton

Field Summary
private  Frame[] frames
           
private  java.util.List[] handlers
           
private  InsnList insns
           
private  Interpreter interpreter
           
private  int n
           
private  int[] queue
           
private  boolean[] queued
           
private  Subroutine[] subroutines
           
private  int top
           
 
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_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, 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, 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, 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, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6
 
Constructor Summary
Analyzer(Interpreter interpreter)
          Constructs a new Analyzer.
 
Method Summary
 Frame[] analyze(java.lang.String owner, MethodNode m)
          Analyzes the given method.
private  void findSubroutine(int insn, Subroutine sub, java.util.List calls)
           
 Frame[] getFrames()
          Returns the symbolic stack frame for each instruction of the last recently analyzed method.
 java.util.List getHandlers(int insn)
          Returns the exception handlers for the given instruction.
private  void merge(int insn, Frame beforeJSR, Frame afterRET, Subroutine subroutineBeforeJSR, boolean[] access)
           
private  void merge(int insn, Frame frame, Subroutine subroutine)
           
protected  void newControlFlowEdge(int insn, int successor)
          Creates a control flow graph edge.
protected  boolean newControlFlowExceptionEdge(int insn, int successor)
          Creates a control flow graph edge corresponding to an exception handler.
protected  Frame newFrame(Frame src)
          Constructs a new frame that is identical to the given frame.
protected  Frame newFrame(int nLocals, int nStack)
          Constructs a new frame with the given size.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

interpreter

private Interpreter interpreter

n

private int n

insns

private InsnList insns

handlers

private java.util.List[] handlers

frames

private Frame[] frames

subroutines

private Subroutine[] subroutines

queued

private boolean[] queued

queue

private int[] queue

top

private int top
Constructor Detail

Analyzer

public Analyzer(Interpreter interpreter)
Constructs a new Analyzer.

Parameters:
interpreter - the interpreter to be used to symbolically interpret the bytecode instructions.
Method Detail

analyze

public Frame[] analyze(java.lang.String owner,
                       MethodNode m)
                throws AnalyzerException
Analyzes the given method.

Parameters:
owner - the internal name of the class to which the method belongs.
m - 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 insn,
                            Subroutine sub,
                            java.util.List calls)
                     throws AnalyzerException
Throws:
AnalyzerException

getFrames

public Frame[] getFrames()
Returns the symbolic stack frame for each instruction of the last recently 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 occured during the analysis of the method.

getHandlers

public java.util.List getHandlers(int insn)
Returns the exception handlers for the given instruction.

Parameters:
insn - the index of an instruction of the last recently analyzed method.
Returns:
a list of TryCatchBlockNode objects.

newFrame

protected Frame newFrame(int nLocals,
                         int nStack)
Constructs a new frame with the given size.

Parameters:
nLocals - the maximum number of local variables of the frame.
nStack - the maximum stack size of the frame.
Returns:
the created frame.

newFrame

protected Frame newFrame(Frame src)
Constructs a new frame that is identical to the given frame.

Parameters:
src - a frame.
Returns:
the created frame.

newControlFlowEdge

protected void newControlFlowEdge(int insn,
                                  int successor)
Creates a control flow graph edge. The default implementation of this method does nothing. It can be overriden in order to construct the control flow graph of a method (this method is called by the analyze method during its visit of the method's code).

Parameters:
insn - an instruction index.
successor - index of a successor instruction.

newControlFlowExceptionEdge

protected boolean newControlFlowExceptionEdge(int insn,
                                              int successor)
Creates a control flow graph edge corresponding to an exception handler. The default implementation of this method does nothing. It can be overriden in order to construct the control flow graph of a method (this method is called by the analyze method during its visit of the method's code).

Parameters:
insn - an instruction index.
successor - 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.

merge

private void merge(int insn,
                   Frame frame,
                   Subroutine subroutine)
            throws AnalyzerException
Throws:
AnalyzerException

merge

private void merge(int insn,
                   Frame beforeJSR,
                   Frame afterRET,
                   Subroutine subroutineBeforeJSR,
                   boolean[] access)
            throws AnalyzerException
Throws:
AnalyzerException