Class OpcodeStack

java.lang.Object
edu.umd.cs.findbugs.OpcodeStack

public class OpcodeStack extends 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 Details

    • JAVA_UTIL_ARRAYS_ARRAY_LIST

      private static final String JAVA_UTIL_ARRAYS_ARRAY_LIST
      See Also:
    • JAVA_UTIL_COLLECTIONS

      private static final String JAVA_UTIL_COLLECTIONS
      See Also:
    • DEBUG

      private static final boolean DEBUG
    • DEBUG2

      private static final boolean DEBUG2
    • IMMUTABLE_RETURNER_MAP

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

      @StaticConstant static final HashMap<String,String> boxedTypes
    • stack

      private List<OpcodeStack.Item> stack
    • lvValues

      private List<OpcodeStack.Item> lvValues
    • lastUpdate

      private final List<Integer> lastUpdate
    • top

      private boolean top
    • seenTransferOfControl

      private boolean seenTransferOfControl
    • useIterativeAnalysis

      private final boolean useIterativeAnalysis
    • encountedTop

      boolean encountedTop
    • backwardsBranch

      boolean backwardsBranch
    • exceptionHandlers

      BitSet exceptionHandlers
    • jumpInfoChangedByBackwardsBranch

      private boolean jumpInfoChangedByBackwardsBranch
    • jumpInfoChangedByNewTarget

      private boolean jumpInfoChangedByNewTarget
    • jumpEntries

      private Map<Integer,List<OpcodeStack.Item>> jumpEntries
    • jumpStackEntries

      private Map<Integer,List<OpcodeStack.Item>> jumpStackEntries
    • jumpEntryLocations

      private 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 String methodName
    • fullyQualifiedMethodName

      private String fullyQualifiedMethodName
    • v

  • Constructor Details

    • OpcodeStack

      public OpcodeStack()
  • Method Details

    • toString

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

      public boolean hasIncomingBranches(int pc)
    • getExceptionSig

      public static String getExceptionSig(DismantleBytecode dbc, org.apache.bcel.classfile.CodeException e)
    • mergeJumps

      public void mergeJumps(DismantleBytecode dbc)
    • setLastUpdate

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

      public int getLastUpdate(int reg)
    • getNumLastUpdates

      public int getNumLastUpdates()
    • sawOpcode

      public void sawOpcode(DismantleBytecode dbc, int seen)
    • eraseKnowledgeOf

      private void eraseKnowledgeOf(XField fieldOperand)
    • precomputation

      public void precomputation(DismantleBytecode dbc)
    • constantToInt

      private int constantToInt(OpcodeStack.Item it)
    • constantToFloat

      private float constantToFloat(OpcodeStack.Item it)
    • constantToDouble

      private double constantToDouble(OpcodeStack.Item it)
    • constantToLong

      private long constantToLong(OpcodeStack.Item it)
    • 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(Class<?>... clss)
    • markConstantValueUnknown

      private void markConstantValueUnknown(OpcodeStack.Item item)
    • processMethodCall

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

      private boolean isMethodThatReturnsGivenReference(String clsName, 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(List<OpcodeStack.Item> mergeInto, 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)
    • learnFrom

      public void learnFrom(OpcodeStack.JumpInfo info)
    • initialize

      public void initialize()
    • resetForMethodEntry

      public int resetForMethodEntry(DismantleBytecode visitor)
    • nullSafeSize

      int nullSafeSize(@CheckForNull Collection<?> c)
    • getJumpInfo

      private OpcodeStack.JumpInfo getJumpInfo()
    • getJumpInfoFromStackMap

      private StackMapAnalyzer.JumpInfoFromStackMap getJumpInfoFromStackMap()
    • setJumpInfoChangedByBackwardBranch

      public void setJumpInfoChangedByBackwardBranch(String kind, int from, int to)
    • resetForMethodEntry0

      private int resetForMethodEntry0(PreorderVisitor visitor)
    • resetForMethodEntry0

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

      public int getStackDepth()
    • getStackItem

      public OpcodeStack.Item getStackItem(int stackOffset)
    • pop

      private OpcodeStack.Item pop()
    • top

      private OpcodeStack.Item top()
    • replace

      public void replace(int stackOffset, OpcodeStack.Item value)
    • replaceTop

      public void replaceTop(OpcodeStack.Item newTop)
    • pop

      private void pop(int count)
    • push

      private void push(OpcodeStack.Item i)
    • pushByConstant

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

      private void pushByLocalObjectLoad(DismantleBytecode dbc, int register)
    • pushByIntMath

      private void pushByIntMath(DismantleBytecode dbc, int seen, OpcodeStack.Item lhs, OpcodeStack.Item rhs)
    • pushByLongMath

      private void pushByLongMath(int seen, OpcodeStack.Item lhs, OpcodeStack.Item rhs)
    • pushByFloatMath

      private void pushByFloatMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
    • pushByDoubleMath

      private void pushByDoubleMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
    • pushByInvoke

      private void pushByInvoke(DismantleBytecode dbc, boolean popThis)
    • getItemMethodInvokedOn

      public OpcodeStack.Item getItemMethodInvokedOn(DismantleBytecode dbc)
    • getStringFromIndex

      private String getStringFromIndex(DismantleBytecode dbc, int i)
    • pushBySignature

      private void pushBySignature(String s, DismantleBytecode dbc)
    • pushByLocalStore

      private void pushByLocalStore(int register)
    • clearRegisterLoad

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

      private void pushByLocalLoad(String signature, int register)
    • setLVValue

      private void setLVValue(int index, OpcodeStack.Item value)
    • getLVValue

      @Nonnull public OpcodeStack.Item getLVValue(int index)
    • 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()