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 Summary
FieldsModifier and TypeFieldDescriptionprivate final ValueNumberCacheprivate final HashMap<Object, ValueNumber> private static final ValueNumber[](package private) ValueNumberFactoryprivate org.apache.bcel.generic.InstructionHandleprivate final LoadedFieldSetprivate final org.apache.bcel.generic.MethodGenprivate final HashMap<ValueNumber, String> Fields inherited from class AbstractFrameModelingVisitor
cpgFields inherited from interface Debug
VERIFY_INTEGRITYFields inherited from interface ValueNumberAnalysisFeatures
REDUNDANT_LOAD_ELIMINATION, RLE_DEBUG -
Constructor Summary
ConstructorsConstructorDescriptionValueNumberFrameModelingVisitor(org.apache.bcel.generic.MethodGen methodGen, ValueNumberFactory factory, ValueNumberCache cache, LoadedFieldSet loadedFieldSet, RepositoryLookupFailureCallback lookupFailureCallback) Constructor. -
Method Summary
Modifier and TypeMethodDescriptionprivate static ValueNumber[]allocateValueNumberArray(int size) Creates a new empty array (if needed) with given size.private voidcheckConsumedAndProducedValues(org.apache.bcel.generic.Instruction ins, ValueNumber[] consumedValueList, ValueNumber[] producedValueList) private booleanDetermine whether forward substitution should be performed for the heap location referenced by the current instruction.private booleanDetermine whether redundant load elimination should be performed for the heap location referenced by the current instruction.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 voidkillLoadsOfObjectsPassed(org.apache.bcel.generic.INVOKEDYNAMIC ins) private voidkillLoadsOfObjectsPassed(org.apache.bcel.generic.InvokeInstruction ins) private voidloadInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj) Load an instance field.private voidloadStaticField(XField staticField, org.apache.bcel.generic.Instruction obj) Load a static field.voidmodelNormalInstruction(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 voidpushOutputValues(ValueNumber[] outputValueList) Push given output values onto the current frame.voidsetHandle(org.apache.bcel.generic.InstructionHandle handle) Set the instruction handle of the instruction currently being visited.private voidstoreInstanceField(XField instanceField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue) Store an instance field.private voidstoreStaticField(XField staticField, org.apache.bcel.generic.Instruction obj, boolean pushStoredValue) Store a static field.voidvisitACONST_NULL(org.apache.bcel.generic.ACONST_NULL obj) voidvisitCHECKCAST(org.apache.bcel.generic.CHECKCAST obj) voidvisitGETFIELD(org.apache.bcel.generic.GETFIELD obj) voidvisitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj) voidvisitIINC(org.apache.bcel.generic.IINC obj) voidvisitInvokeOnException(org.apache.bcel.generic.Instruction obj) voidvisitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj) voidvisitINVOKEVIRTUAL(org.apache.bcel.generic.INVOKEVIRTUAL obj) voidvisitLDC(org.apache.bcel.generic.LDC obj) voidvisitMONITORENTER(org.apache.bcel.generic.MONITORENTER obj) voidvisitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj) voidvisitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj) private static Stringvlts(ValueNumber[] vl) Methods inherited from class 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 Details
-
methodGen
private final org.apache.bcel.generic.MethodGen methodGen -
factory
ValueNumberFactory factory -
cache
-
loadedFieldSet
-
constantValueMap
-
stringConstantMap
-
handle
private org.apache.bcel.generic.InstructionHandle handle -
EMPTY_INPUT_VALUE_LIST
-
-
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 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 Details
-
getDefaultValue
Description copied from class:AbstractFrameModelingVisitorProduce a "default" value. This is what is pushed onto the stack by the handleNormalInstruction() method for instructions which produce stack values.- Specified by:
getDefaultValuein 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:
modelNormalInstructionin 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:
visitGETFIELDin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitGETFIELDin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitPUTFIELD
public void visitPUTFIELD(org.apache.bcel.generic.PUTFIELD obj) - Specified by:
visitPUTFIELDin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitPUTFIELDin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitGETSTATIC
public void visitGETSTATIC(org.apache.bcel.generic.GETSTATIC obj) - Specified by:
visitGETSTATICin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitGETSTATICin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitPUTSTATIC
public void visitPUTSTATIC(org.apache.bcel.generic.PUTSTATIC obj) - Specified by:
visitPUTSTATICin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitPUTSTATICin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitINVOKESTATIC
public void visitINVOKESTATIC(org.apache.bcel.generic.INVOKESTATIC obj) - Specified by:
visitINVOKESTATICin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitINVOKESTATICin 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:
visitMONITORENTERin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitMONITORENTERin 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:
visitINVOKEVIRTUALin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitINVOKEVIRTUALin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitACONST_NULL
public void visitACONST_NULL(org.apache.bcel.generic.ACONST_NULL obj) - Specified by:
visitACONST_NULLin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitACONST_NULLin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitLDC
public void visitLDC(org.apache.bcel.generic.LDC obj) - Specified by:
visitLDCin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitLDCin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitIINC
public void visitIINC(org.apache.bcel.generic.IINC obj) - Specified by:
visitIINCin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitIINCin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
visitCHECKCAST
public void visitCHECKCAST(org.apache.bcel.generic.CHECKCAST obj) - Specified by:
visitCHECKCASTin interfaceorg.apache.bcel.generic.Visitor- Overrides:
visitCHECKCASTin classAbstractFrameModelingVisitor<ValueNumber, ValueNumberFrame>
-
popInputValues
Pop the input values for the given instruction from the current frame. -
pushOutputValues
Push given output values onto the current frame. -
getOutputValues
Get output values for current instruction from the ValueNumberCache. -
getOutputValues
private ValueNumber[] getOutputValues(ValueNumber[] inputValueList, int numWordsProduced, int flags) -
allocateValueNumberArray
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
-
loadInstanceField
Load an instance field.- Parameters:
instanceField- the fieldobj- the Instruction loading the field
-
loadStaticField
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)
-