Class Analyzer<V extends Value>

  • Type Parameters:
    V - type of the Value used for the analysis.
    All Implemented Interfaces:
    org.objectweb.asm.Opcodes

    public class Analyzer<V extends Value>
    extends java.lang.Object
    implements org.objectweb.asm.Opcodes
    A semantic bytecode analyzer. This class does not fully check that JSR and RET instructions are valid.
    • Field Summary

      • 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_RECORD, 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, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, 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, V15, V16, V17, V18, V9
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      Frame<V>[] analyze​(java.lang.String owner, org.objectweb.asm.tree.MethodNode method)
      Analyzes the given method.
      Frame<V>[] analyzeAndComputeMaxs​(java.lang.String owner, org.objectweb.asm.tree.MethodNode method)
      Analyzes the given method and computes and sets its maximum stack size and maximum number of local variables.
      Frame<V>[] getFrames()
      Returns the symbolic execution stack frame for each instruction of the last analyzed method.
      java.util.List<org.objectweb.asm.tree.TryCatchBlockNode> getHandlers​(int insnIndex)
      Returns the exception handlers for the given instruction.
      protected void init​(java.lang.String owner, org.objectweb.asm.tree.MethodNode method)
      Initializes this analyzer.
      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, org.objectweb.asm.tree.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.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • Analyzer

        public Analyzer​(Interpreter<V> interpreter)
        Constructs a new Analyzer.
        Parameters:
        interpreter - the interpreter to use to symbolically interpret the bytecode instructions.
    • Method Detail

      • analyze

        public Frame<V>[] analyze​(java.lang.String owner,
                                  org.objectweb.asm.tree.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. The maxStack and maxLocals fields must have correct values.
        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.
      • analyzeAndComputeMaxs

        public Frame<V>[] analyzeAndComputeMaxs​(java.lang.String owner,
                                                org.objectweb.asm.tree.MethodNode method)
                                         throws AnalyzerException
        Analyzes the given method and computes and sets its maximum stack size and maximum number of local variables.
        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.
      • 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<org.objectweb.asm.tree.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,
                            org.objectweb.asm.tree.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 the analyze(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 the analyze(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,
                                                      org.objectweb.asm.tree.TryCatchBlockNode tryCatchBlock)
        Creates a control flow graph edge corresponding to an exception handler. The default implementation of this method delegates to newControlFlowExceptionEdge(int, int). It can be overridden in order to construct the control flow graph of a method (this method is called by the analyze(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).