Package edu.umd.cs.findbugs.ba.vna
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:
ValueNumber
,ValueNumberFrame
,ValueNumberAnalysis
-
-
Field Summary
Fields Modifier and Type Field Description private ValueNumberCache
cache
private java.util.HashMap<java.lang.Object,ValueNumber>
constantValueMap
private static ValueNumber[]
EMPTY_INPUT_VALUE_LIST
(package private) ValueNumberFactory
factory
private org.apache.bcel.generic.InstructionHandle
handle
private LoadedFieldSet
loadedFieldSet
private org.apache.bcel.generic.MethodGen
methodGen
private java.util.HashMap<ValueNumber,java.lang.String>
stringConstantMap
-
Fields inherited from class edu.umd.cs.findbugs.ba.AbstractFrameModelingVisitor
cpg
-
Fields inherited from interface edu.umd.cs.findbugs.ba.Debug
VERIFY_INTEGRITY
-
Fields inherited from interface edu.umd.cs.findbugs.ba.vna.ValueNumberAnalysisFeatures
REDUNDANT_LOAD_ELIMINATION, RLE_DEBUG
-
-
Constructor Summary
Constructors Constructor Description ValueNumberFrameModelingVisitor(org.apache.bcel.generic.MethodGen methodGen, ValueNumberFactory factory, ValueNumberCache cache, LoadedFieldSet loadedFieldSet, RepositoryLookupFailureCallback lookupFailureCallback)
Constructor.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static ValueNumber[]
allocateValueNumberArray(int size)
Creates a new empty array (if needed) with given size.private void
checkConsumedAndProducedValues(org.apache.bcel.generic.Instruction ins, ValueNumber[] consumedValueList, ValueNumber[] producedValueList)
private boolean
doForwardSubstitution()
Determine whether forward substitution should be performed for the heap location referenced by the current instruction.private boolean
doRedundantLoadElimination()
Determine whether redundant load elimination should be performed for the heap location referenced by the current instruction.ValueNumber
getDefaultValue()
Produce a "default" value.private ValueNumber[]
getOutputValues(ValueNumber[] inputValueList, int numWordsProduced)
Get output values for current instruction from the ValueNumberCache.private ValueNumber[]
getOutputValues(ValueNumber[] inputValueList, int numWordsProduced, int flags)
private void
killLoadsOfObjectsPassed(org.apache.bcel.generic.INVOKEDYNAMIC ins)
private void
killLoadsOfObjectsPassed(org.apache.bcel.generic.InvokeInstruction ins)
private void
loadInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj)
Load an instance field.private void
loadStaticField(XField staticField, org.apache.bcel.generic.Instruction obj)
Load a static field.void
modelNormalInstruction(org.apache.bcel.generic.Instruction ins, int numWordsConsumed, int numWordsProduced)
This is the default instruction modeling method.private ValueNumber[]
popInputValues(int numWordsConsumed)
Pop the input values for the given instruction from the current frame.private void
pushOutputValues(ValueNumber[] outputValueList)
Push given output values onto the current frame.void
setHandle(org.apache.bcel.generic.InstructionHandle handle)
Set the instruction handle of the instruction currently being visited.private void
storeInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue)
Store an instance field.private void
storeStaticField(XField staticField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue)
Store a static field.void
visitACONST_NULL(org.apache.bcel.generic.ACONST_NULL obj)
void
visitCHECKCAST(org.apache.bcel.generic.CHECKCAST obj)
void
visitGETFIELD(org.apache.bcel.generic.GETFIELD obj)
void
visitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj)
void
visitIINC(org.apache.bcel.generic.IINC obj)
void
visitInvokeOnException(org.apache.bcel.generic.Instruction obj)
void
visitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj)
void
visitINVOKEVIRTUAL(org.apache.bcel.generic.INVOKEVIRTUAL obj)
void
visitLDC(org.apache.bcel.generic.LDC obj)
void
visitMONITORENTER(org.apache.bcel.generic.MONITORENTER obj)
void
visitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj)
void
visitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj)
private static java.lang.String
vlts(ValueNumber[] vl)
-
Methods inherited from class edu.umd.cs.findbugs.ba.AbstractFrameModelingVisitor
analyzeInstruction, getCPG, getFrame, getLocation, getNumWordsConsumed, getNumWordsProduced, handleLoadInstruction, handleNormalInstruction, handleStoreInstruction, modelInstruction, setFrameAndLocation, visitAALOAD, visitAASTORE, visitAllocationInstruction, visitALOAD, visitANEWARRAY, visitARETURN, visitArithmeticInstruction, visitArrayInstruction, visitARRAYLENGTH, visitASTORE, visitATHROW, visitBALOAD, visitBASTORE, visitBIPUSH, visitBranchInstruction, visitBREAKPOINT, visitCALOAD, visitCASTORE, visitConstantPushInstruction, visitConversionInstruction, visitConversionInstruction2, visitCPInstruction, visitD2F, visitD2I, visitD2L, visitDADD, visitDALOAD, visitDASTORE, visitDCMPG, visitDCMPL, visitDCONST, visitDDIV, visitDLOAD, visitDMUL, visitDNEG, visitDREM, visitDRETURN, visitDSTORE, visitDSUB, visitDUP, visitDUP_X1, visitDUP_X2, visitDUP2, visitDUP2_X1, visitDUP2_X2, visitExceptionThrower, visitF2D, visitF2I, visitF2L, visitFADD, visitFALOAD, visitFASTORE, visitFCMPG, visitFCMPL, visitFCONST, visitFDIV, visitFieldInstruction, visitFieldOrMethod, visitFLOAD, visitFMUL, visitFNEG, visitFREM, visitFRETURN, visitFSTORE, visitFSUB, visitGOTO, visitGOTO_W, visitGotoInstruction, visitI2B, visitI2C, visitI2D, visitI2F, visitI2L, visitI2S, visitIADD, visitIALOAD, visitIAND, visitIASTORE, visitICONST, visitIDIV, visitIF_ACMPEQ, visitIF_ACMPNE, visitIF_ICMPEQ, visitIF_ICMPGE, visitIF_ICMPGT, visitIF_ICMPLE, visitIF_ICMPLT, visitIF_ICMPNE, visitIFEQ, visitIFGE, visitIFGT, visitIfInstruction, visitIFLE, visitIFLT, visitIFNE, visitIFNONNULL, visitIFNULL, visitILOAD, visitIMPDEP1, visitIMPDEP2, visitIMUL, visitINEG, visitINSTANCEOF, visitINVOKEDYNAMIC, visitInvokeInstruction, visitINVOKEINTERFACE, visitINVOKESPECIAL, visitIOR, visitIREM, visitIRETURN, visitISHL, visitISHR, visitISTORE, visitISUB, visitIUSHR, visitIXOR, visitJSR, visitJSR_W, visitJsrInstruction, visitL2D, visitL2F, visitL2I, visitLADD, visitLALOAD, visitLAND, visitLASTORE, visitLCMP, visitLCONST, visitLDC2_W, visitLDIV, visitLLOAD, visitLMUL, visitLNEG, visitLoadClass, visitLoadInstruction, visitLocalVariableInstruction, visitLOOKUPSWITCH, visitLOR, visitLREM, visitLRETURN, visitLSHL, visitLSHR, visitLSTORE, visitLSUB, visitLUSHR, visitLXOR, visitMONITOREXIT, visitMULTIANEWARRAY, visitNEW, visitNEWARRAY, visitNONNULL2Z, visitNOP, visitNULL2Z, visitPOP, visitPOP2, visitPopInstruction, visitPushInstruction, visitRET, visitRETURN, visitReturnInstruction, visitSALOAD, visitSASTORE, visitSelect, visitSIPUSH, visitStackConsumer, visitStackInstruction, visitStackProducer, visitStoreInstruction, visitSWAP, visitTABLESWITCH, visitTypedInstruction, visitUnconditionalBranch, visitVariableLengthInstruction
-
-
-
-
Field Detail
-
methodGen
private final org.apache.bcel.generic.MethodGen methodGen
-
factory
ValueNumberFactory factory
-
cache
private final ValueNumberCache cache
-
loadedFieldSet
private final LoadedFieldSet loadedFieldSet
-
constantValueMap
private final java.util.HashMap<java.lang.Object,ValueNumber> constantValueMap
-
stringConstantMap
private final java.util.HashMap<ValueNumber,java.lang.String> stringConstantMap
-
handle
private org.apache.bcel.generic.InstructionHandle handle
-
EMPTY_INPUT_VALUE_LIST
private static final ValueNumber[] EMPTY_INPUT_VALUE_LIST
-
-
Constructor Detail
-
ValueNumberFrameModelingVisitor
public ValueNumberFrameModelingVisitor(org.apache.bcel.generic.MethodGen methodGen, ValueNumberFactory factory, ValueNumberCache cache, LoadedFieldSet loadedFieldSet, RepositoryLookupFailureCallback lookupFailureCallback)
Constructor.- Parameters:
methodGen
- the method being analyzedfactory
- factory for ValueNumbers for the methodcache
- cache of input/output transformations for each instructionloadedFieldSet
- fields loaded/stored by each instruction and entire methodlookupFailureCallback
- callback to use to report class lookup failures
-
-
Method Detail
-
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 classAbstractFrameModelingVisitor<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 classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
- Parameters:
ins
- the Instruction to modelnumWordsConsumed
- number of stack words consumednumWordsProduced
- number of stack words produced
-
visitGETFIELD
public void visitGETFIELD(org.apache.bcel.generic.GETFIELD obj)
- Specified by:
visitGETFIELD
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitGETFIELD
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitPUTFIELD
public void visitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj)
- Specified by:
visitPUTFIELD
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitPUTFIELD
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitGETSTATIC
public void visitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj)
- Specified by:
visitGETSTATIC
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitGETSTATIC
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitPUTSTATIC
public void visitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj)
- Specified by:
visitPUTSTATIC
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitPUTSTATIC
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitINVOKESTATIC
public void visitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj)
- Specified by:
visitINVOKESTATIC
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitINVOKESTATIC
in classAbstractFrameModelingVisitor<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 interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitMONITORENTER
in classAbstractFrameModelingVisitor<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 interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitINVOKEVIRTUAL
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitACONST_NULL
public void visitACONST_NULL(org.apache.bcel.generic.ACONST_NULL obj)
- Specified by:
visitACONST_NULL
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitACONST_NULL
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitLDC
public void visitLDC(org.apache.bcel.generic.LDC obj)
- Specified by:
visitLDC
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitLDC
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitIINC
public void visitIINC(org.apache.bcel.generic.IINC obj)
- Specified by:
visitIINC
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitIINC
in classAbstractFrameModelingVisitor<ValueNumber,ValueNumberFrame>
-
visitCHECKCAST
public void visitCHECKCAST(org.apache.bcel.generic.CHECKCAST obj)
- Specified by:
visitCHECKCAST
in interfaceorg.apache.bcel.generic.Visitor
- Overrides:
visitCHECKCAST
in classAbstractFrameModelingVisitor<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 java.lang.String vlts(ValueNumber[] vl)
-
loadInstanceField
private void loadInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj)
Load an instance field.- Parameters:
instanceField
- the fieldobj
- the Instruction loading the field
-
loadStaticField
private void loadStaticField(XField staticField, org.apache.bcel.generic.Instruction obj)
Load a static field.- Parameters:
staticField
- the fieldobj
- 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 fieldobj
- the instruction which stores the fieldpushStoredValue
- 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 fieldobj
- the instruction which stores the fieldpushStoredValue
- push the stored value onto the stack (because we are modeling an inner-class field access method)
-
-