Class OpcodeStack


  • public class OpcodeStack
    extends java.lang.Object
    tracks the types and numbers of objects that are currently on the operand stack throughout the execution of method. To use, a detector should instantiate one for each method, and call

    stack.sawOpcode(this,seen);

    at the bottom of their sawOpcode method. at any point you can then inspect the stack and see what the types of objects are on the stack, including constant values if they were pushed. The types described are of course, only the static types. There are some outstanding opcodes that have yet to be implemented, I couldn't find any code that actually generated these, so i didn't put them in because I couldn't test them:
    • dup2_x2
    • jsr_w
    • wide
    • Field Detail

      • JAVA_UTIL_ARRAYS_ARRAY_LIST

        private static final java.lang.String JAVA_UTIL_ARRAYS_ARRAY_LIST
        See Also:
        Constant Field Values
      • JAVA_UTIL_COLLECTIONS

        private static final java.lang.String JAVA_UTIL_COLLECTIONS
        See Also:
        Constant Field Values
      • DEBUG

        private static final boolean DEBUG
      • DEBUG2

        private static final boolean DEBUG2
      • IMMUTABLE_RETURNER_MAP

        private static final java.util.Map<org.apache.commons.lang3.tuple.Pair<java.lang.String,​java.lang.String>,​java.lang.String> IMMUTABLE_RETURNER_MAP
      • boxedTypes

        @StaticConstant
        static final java.util.HashMap<java.lang.String,​java.lang.String> boxedTypes
      • lastUpdate

        private final java.util.List<java.lang.Integer> lastUpdate
      • top

        private boolean top
      • seenTransferOfControl

        private boolean seenTransferOfControl
      • useIterativeAnalysis

        private final boolean useIterativeAnalysis
      • encountedTop

        boolean encountedTop
      • backwardsBranch

        boolean backwardsBranch
      • exceptionHandlers

        java.util.BitSet exceptionHandlers
      • jumpInfoChangedByBackwardsBranch

        private boolean jumpInfoChangedByBackwardsBranch
      • jumpInfoChangedByNewTarget

        private boolean jumpInfoChangedByNewTarget
      • jumpEntries

        private java.util.Map<java.lang.Integer,​java.util.List<OpcodeStack.Item>> jumpEntries
      • jumpStackEntries

        private java.util.Map<java.lang.Integer,​java.util.List<OpcodeStack.Item>> jumpStackEntries
      • jumpEntryLocations

        private java.util.BitSet jumpEntryLocations
      • convertJumpToOneZeroState

        int convertJumpToOneZeroState
      • convertJumpToZeroOneState

        int convertJumpToZeroOneState
      • registerTestedFoundToBeNonnegative

        int registerTestedFoundToBeNonnegative
      • zeroOneComing

        int zeroOneComing
      • oneMeansNull

        boolean oneMeansNull
      • needToMerge

        boolean needToMerge
      • reachOnlyByBranch

        private boolean reachOnlyByBranch
      • methodName

        private java.lang.String methodName
      • fullyQualifiedMethodName

        private java.lang.String fullyQualifiedMethodName
    • Constructor Detail

      • OpcodeStack

        public OpcodeStack()
    • Method Detail

      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • hasIncomingBranches

        public boolean hasIncomingBranches​(int pc)
      • getExceptionSig

        public static java.lang.String getExceptionSig​(DismantleBytecode dbc,
                                                       org.apache.bcel.classfile.CodeException e)
      • setLastUpdate

        private void setLastUpdate​(int reg,
                                   int pc)
      • getLastUpdate

        public int getLastUpdate​(int reg)
      • getNumLastUpdates

        public int getNumLastUpdates()
      • eraseKnowledgeOf

        private void eraseKnowledgeOf​(XField fieldOperand)
      • handleDcmp

        private void handleDcmp​(int opcode)
      • handleFcmp

        private void handleFcmp​(int opcode)
      • handleLcmp

        private void handleLcmp()
      • handleSwap

        private void handleSwap()
      • handleDup

        private void handleDup()
      • handleDupX1

        private void handleDupX1()
      • handleDup2

        private void handleDup2()
      • handleDup2X1

        private void handleDup2X1()
      • handleDup2X2

        private void handleDup2X2()
      • handleDupX2

        private void handleDupX2()
      • addBoxedType

        private static void addBoxedType​(java.lang.Class<?>... clss)
      • markConstantValueUnknown

        private void markConstantValueUnknown​(OpcodeStack.Item item)
      • processMethodCall

        private void processMethodCall​(DismantleBytecode dbc,
                                       int seen)
      • isMethodThatReturnsGivenReference

        private boolean isMethodThatReturnsGivenReference​(java.lang.String clsName,
                                                          java.lang.String methodName)
      • processInvokeDynamic

        private void processInvokeDynamic​(DismantleBytecode dbc)
      • getBootstrapMethod

        private org.apache.bcel.classfile.BootstrapMethod getBootstrapMethod​(org.apache.bcel.classfile.Attribute[] attribs,
                                                                             org.apache.bcel.classfile.Constant index)
      • mergeLists

        private boolean mergeLists​(java.util.List<OpcodeStack.Item> mergeInto,
                                   java.util.List<OpcodeStack.Item> mergeFrom,
                                   boolean errorIfSizesDoNotMatch)
      • clear

        public void clear()
      • printJumpEntries

        public void printJumpEntries()
      • isJumpTarget

        public boolean isJumpTarget​(int pc)
      • addJumpValue

        private void addJumpValue​(int from,
                                  int target)
      • initialize

        public void initialize()
      • resetForMethodEntry

        public int resetForMethodEntry​(DismantleBytecode visitor)
      • nullSafeSize

        int nullSafeSize​(@CheckForNull
                         java.util.Collection<?> c)
      • setJumpInfoChangedByBackwardBranch

        public void setJumpInfoChangedByBackwardBranch​(java.lang.String kind,
                                                       int from,
                                                       int to)
      • resetForMethodEntry0

        private int resetForMethodEntry0​(PreorderVisitor visitor)
      • resetForMethodEntry0

        int resetForMethodEntry0​(@SlashedClassName
                                 java.lang.String className,
                                 org.apache.bcel.classfile.Method m)
      • getStackDepth

        public int getStackDepth()
      • pop

        private void pop​(int count)
      • pushByConstant

        private void pushByConstant​(DismantleBytecode dbc,
                                    org.apache.bcel.classfile.Constant c)
      • pushByLocalObjectLoad

        private void pushByLocalObjectLoad​(DismantleBytecode dbc,
                                           int register)
      • pushByInvoke

        private void pushByInvoke​(DismantleBytecode dbc,
                                  boolean popThis)
      • getStringFromIndex

        private java.lang.String getStringFromIndex​(DismantleBytecode dbc,
                                                    int i)
      • pushBySignature

        private void pushBySignature​(java.lang.String s,
                                     DismantleBytecode dbc)
      • pushByLocalStore

        private void pushByLocalStore​(int register)
      • clearRegisterLoad

        private static void clearRegisterLoad​(java.util.List<OpcodeStack.Item> list,
                                              int register)
      • pushByLocalLoad

        private void pushByLocalLoad​(java.lang.String signature,
                                     int register)
      • getNumLocalValues

        public int getNumLocalValues()
      • setTop

        private void setTop​(boolean top)
      • isTop

        public boolean isTop()
      • setReachOnlyByBranch

        void setReachOnlyByBranch​(boolean reachOnlyByBranch)
      • isReachOnlyByBranch

        boolean isReachOnlyByBranch()
      • isJumpInfoChangedByBackwardsBranch

        boolean isJumpInfoChangedByBackwardsBranch()
      • clearJumpInfoChangedByBackwardsBranch

        void clearJumpInfoChangedByBackwardsBranch()
      • setJumpInfoChangedByBackwardsBranch

        void setJumpInfoChangedByBackwardsBranch​(int from,
                                                 int to)
      • isJumpInfoChangedByNewTarget

        protected boolean isJumpInfoChangedByNewTarget()
        Returns:
        Returns the jumpInfoChangedByNewTarget.
      • clearJumpInfoChangedByNewTarget

        void clearJumpInfoChangedByNewTarget()
      • setJumpInfoChangedByNewTarget

        protected void setJumpInfoChangedByNewTarget()