Class ValueNumberFrameModelingVisitor

java.lang.Object
edu.umd.cs.findbugs.ba.AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
edu.umd.cs.findbugs.ba.vna.ValueNumberFrameModelingVisitor
All Implemented Interfaces:
Debug, ValueNumberAnalysisFeatures, org.apache.bcel.generic.Visitor

public class ValueNumberFrameModelingVisitor extends AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame> implements Debug, ValueNumberAnalysisFeatures
Visitor which models the effects of bytecode instructions on value numbers of values in the operand stack frames.
See Also:
  • Field Details

  • Constructor Details

    • ValueNumberFrameModelingVisitor

      public ValueNumberFrameModelingVisitor(org.apache.bcel.generic.MethodGen methodGen, ValueNumberFactory factory, ValueNumberCache cache, LoadedFieldSet loadedFieldSet, RepositoryLookupFailureCallback lookupFailureCallback)
      Constructor.
      Parameters:
      methodGen - the method being analyzed
      factory - factory for ValueNumbers for the method
      cache - cache of input/output transformations for each instruction
      loadedFieldSet - fields loaded/stored by each instruction and entire method
      lookupFailureCallback - callback to use to report class lookup failures
  • Method Details

    • getDefaultValue

      public ValueNumber getDefaultValue()
      Description copied from class: AbstractFrameModelingVisitor
      Produce a "default" value. This is what is pushed onto the stack by the handleNormalInstruction() method for instructions which produce stack values.
      Specified by:
      getDefaultValue in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • setHandle

      public void setHandle(org.apache.bcel.generic.InstructionHandle handle)
      Set the instruction handle of the instruction currently being visited. This must be called before the instruction accepts this visitor!
    • doRedundantLoadElimination

      private boolean doRedundantLoadElimination()
      Determine whether redundant load elimination should be performed for the heap location referenced by the current instruction.
      Returns:
      true if we should do redundant load elimination for the current instruction, false if not
    • doForwardSubstitution

      private boolean doForwardSubstitution()
      Determine whether forward substitution should be performed for the heap location referenced by the current instruction.
      Returns:
      true if we should do forward substitution for the current instruction, false if not
    • checkConsumedAndProducedValues

      private void checkConsumedAndProducedValues(org.apache.bcel.generic.Instruction ins, ValueNumber[] consumedValueList, ValueNumber[] producedValueList)
    • modelNormalInstruction

      public void modelNormalInstruction(org.apache.bcel.generic.Instruction ins, int numWordsConsumed, int numWordsProduced)
      This is the default instruction modeling method.
      Overrides:
      modelNormalInstruction in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
      Parameters:
      ins - the Instruction to model
      numWordsConsumed - number of stack words consumed
      numWordsProduced - number of stack words produced
    • visitGETFIELD

      public void visitGETFIELD(org.apache.bcel.generic.GETFIELD obj)
      Specified by:
      visitGETFIELD in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitGETFIELD in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitPUTFIELD

      public void visitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj)
      Specified by:
      visitPUTFIELD in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitPUTFIELD in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitGETSTATIC

      public void visitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj)
      Specified by:
      visitGETSTATIC in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitGETSTATIC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitPUTSTATIC

      public void visitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj)
      Specified by:
      visitPUTSTATIC in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitPUTSTATIC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitINVOKESTATIC

      public void visitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj)
      Specified by:
      visitINVOKESTATIC in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitINVOKESTATIC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • killLoadsOfObjectsPassed

      private void killLoadsOfObjectsPassed(org.apache.bcel.generic.INVOKEDYNAMIC ins)
    • killLoadsOfObjectsPassed

      private void killLoadsOfObjectsPassed(org.apache.bcel.generic.InvokeInstruction ins)
    • visitMONITORENTER

      public void visitMONITORENTER(org.apache.bcel.generic.MONITORENTER obj)
      Specified by:
      visitMONITORENTER in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitMONITORENTER in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitInvokeOnException

      public void visitInvokeOnException(org.apache.bcel.generic.Instruction obj)
    • visitINVOKEVIRTUAL

      public void visitINVOKEVIRTUAL(org.apache.bcel.generic.INVOKEVIRTUAL obj)
      Specified by:
      visitINVOKEVIRTUAL in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitINVOKEVIRTUAL in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitACONST_NULL

      public void visitACONST_NULL(org.apache.bcel.generic.ACONST_NULL obj)
      Specified by:
      visitACONST_NULL in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitACONST_NULL in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitLDC

      public void visitLDC(org.apache.bcel.generic.LDC obj)
      Specified by:
      visitLDC in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitLDC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitIINC

      public void visitIINC(org.apache.bcel.generic.IINC obj)
      Specified by:
      visitIINC in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitIINC in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • visitCHECKCAST

      public void visitCHECKCAST(org.apache.bcel.generic.CHECKCAST obj)
      Specified by:
      visitCHECKCAST in interface org.apache.bcel.generic.Visitor
      Overrides:
      visitCHECKCAST in class AbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
    • popInputValues

      private ValueNumber[] popInputValues(int numWordsConsumed)
      Pop the input values for the given instruction from the current frame.
    • pushOutputValues

      private void pushOutputValues(ValueNumber[] outputValueList)
      Push given output values onto the current frame.
    • getOutputValues

      private ValueNumber[] getOutputValues(ValueNumber[] inputValueList, int numWordsProduced)
      Get output values for current instruction from the ValueNumberCache.
    • getOutputValues

      private ValueNumber[] getOutputValues(ValueNumber[] inputValueList, int numWordsProduced, int flags)
    • allocateValueNumberArray

      private static ValueNumber[] allocateValueNumberArray(int size)
      Creates a new empty array (if needed) with given size.
      Parameters:
      size - array size
      Returns:
      if size is zero, returns EMPTY_INPUT_VALUE_LIST
    • vlts

      private static String vlts(ValueNumber[] vl)
    • loadInstanceField

      private void loadInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj)
      Load an instance field.
      Parameters:
      instanceField - the field
      obj - the Instruction loading the field
    • loadStaticField

      private void loadStaticField(XField staticField, org.apache.bcel.generic.Instruction obj)
      Load a static field.
      Parameters:
      staticField - the field
      obj - the Instruction loading the field
    • storeInstanceField

      private void storeInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue)
      Store an instance field.
      Parameters:
      instanceField - the field
      obj - the instruction which stores the field
      pushStoredValue - push the stored value onto the stack (because we are modeling an inner-class field access method)
    • storeStaticField

      private void storeStaticField(XField staticField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue)
      Store a static field.
      Parameters:
      staticField - the static field
      obj - the instruction which stores the field
      pushStoredValue - push the stored value onto the stack (because we are modeling an inner-class field access method)