Class UnconditionalValueDerefAnalysis
java.lang.Object
edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
edu.umd.cs.findbugs.ba.AbstractDataflowAnalysis<UnconditionalValueDerefSet>
edu.umd.cs.findbugs.ba.BackwardDataflowAnalysis<UnconditionalValueDerefSet>
edu.umd.cs.findbugs.ba.deref.UnconditionalValueDerefAnalysis
- All Implemented Interfaces:
DataflowAnalysis<UnconditionalValueDerefSet>
public class UnconditionalValueDerefAnalysis
extends BackwardDataflowAnalysis<UnconditionalValueDerefSet>
Dataflow analysis to find values unconditionally dereferenced in the future.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final AssertionMethodsstatic final booleanprivate final CFGstatic final booleanstatic final booleanstatic final booleanstatic final booleanstatic final booleanprivate IsNullValueDataflowprivate final org.apache.bcel.classfile.Methodprivate final org.apache.bcel.generic.MethodGenprivate static final int[]private static final int[]private TypeDataflowstatic final booleanprivate final ValueNumberDataflow -
Constructor Summary
ConstructorsConstructorDescriptionUnconditionalValueDerefAnalysis(ReverseDepthFirstSearch rdfs, DepthFirstSearch dfs, CFG cfg, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, ValueNumberDataflow vnaDataflow, AssertionMethods assertionMethods) Constructor. -
Method Summary
Modifier and TypeMethodDescriptionprivate static booleancheck(org.apache.bcel.generic.InstructionHandle h, int[] opcodes) static Set<ValueNumber> checkAllNonNullParams(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, org.apache.bcel.classfile.Method method, IsNullValueDataflow invDataflow, TypeDataflow typeDataflow) private voidcheckInstance(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) Check to see if the instruction has a null check associated with it, and if so, add a dereference.private voidcheckNonNullParams(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) If this is a method call instruction, check to see if any of the parameters are @NonNull, and treat them as dereferences.static Set<ValueNumber> checkNonNullParams(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, org.apache.bcel.classfile.Method method, IsNullValueFrame invFrame) private voidcheckNonNullPutField(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) If this is a putfield or putstatic instruction, check to see if the field is @NonNull, and treat it as dereferences.private voidcheckNonNullReturnValue(XMethod thisMethod, Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) If this is a method call instruction, check to see if any of the parameters are @NonNull, and treat them as dereferences.private voidcheckUnconditionalDerefDatabase(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) Check method call at given location to see if it unconditionally dereferences a parameter.static Set<ValueNumber> checkUnconditionalDerefDatabase(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, IsNullValueFrame invFrame, TypeDataflow typeDataflow) voidclearDerefsOnNonNullBranches(IsNullValueDataflow invDataflow) HACK: use the given is-null dataflow to clear deref sets for values that are known to be definitely non-null on a branch.voidcopy(UnconditionalValueDerefSet source, UnconditionalValueDerefSet dest) Copy dataflow facts.Create empty (uninitialized) dataflow facts for one program point.private UnconditionalValueDerefSetReturn a duplicate of given dataflow fact.private ValueNumberClear deref sets of values if this edge is the non-null branch of an if comparison.intprivate voidhandleNullCheck(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) voidInitialize the "entry" fact for the graph.private booleanisAssertion(org.apache.bcel.generic.InstructionHandle handle) Return whether or not given instruction is an assertion.private booleanisExceptionEdge(Edge edge) Determine whether dataflow should be propagated on given edge.booleanDetermine whether the given fact is valid (neither top nor bottom).static booleanisNullCheck(org.apache.bcel.generic.InstructionHandle h, org.apache.bcel.generic.ConstantPoolGen cpg) booleanIs the given fact the top value.voidMake given fact the top value.voidmeetInto(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result) Meet a dataflow fact associated with an incoming edge into another fact.voidmeetInto(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result, boolean onlyEdge) private UnconditionalValueDerefSetFind out if any VNs in the source block contribute to unconditionally dereferenced VNs in the target block.private static booleanreportDereference(IsNullValue value) private static booleanreportDereference(IsNullValueFrame invFrameAtNullCheck, int instance) static booleanreportPotentialDereference(Location location, IsNullValueFrame invFrame) booleansame(UnconditionalValueDerefSet fact1, UnconditionalValueDerefSet fact2) Are given dataflow facts the same?voidsetLastUpdateTimestamp(UnconditionalValueDerefSet fact, int lastUpdate) voidsetTypeDataflow(TypeDataflow typeDataflow) voidCalled before beginning an iteration of analysis.toString()voidtransferInstruction(org.apache.bcel.generic.InstructionHandle handle, BasicBlock basicBlock, UnconditionalValueDerefSet fact) Transfer function for a single instruction.Methods inherited from class BackwardDataflowAnalysis
getBlockOrder, getReverseDepthFirstSearch, isForwardsMethods inherited from class AbstractDataflowAnalysis
getFactAfterLocation, getFactAtLocation, transferMethods inherited from class BasicAbstractDataflowAnalysis
edgeTransfer, factToString, finishIteration, getFactOnEdge, getResultFact, getStartFact, resultFactIterator
-
Field Details
-
DEBUG
public static final boolean DEBUG -
ASSUME_NONZERO_TRIP_LOOPS
public static final boolean ASSUME_NONZERO_TRIP_LOOPS -
IGNORE_DEREF_OF_NCP
public static final boolean IGNORE_DEREF_OF_NCP -
CHECK_ANNOTATIONS
public static final boolean CHECK_ANNOTATIONS -
CHECK_CALLS
public static final boolean CHECK_CALLS -
DEBUG_CHECK_CALLS
public static final boolean DEBUG_CHECK_CALLS -
NULLCHECK1
private static final int[] NULLCHECK1 -
NULLCHECK2
private static final int[] NULLCHECK2 -
cfg
-
method
private final org.apache.bcel.classfile.Method method -
methodGen
private final org.apache.bcel.generic.MethodGen methodGen -
vnaDataflow
-
assertionMethods
-
invDataflow
-
typeDataflow
-
VERBOSE_NULLARG_DEBUG
public static final boolean VERBOSE_NULLARG_DEBUG
-
-
Constructor Details
-
UnconditionalValueDerefAnalysis
public UnconditionalValueDerefAnalysis(ReverseDepthFirstSearch rdfs, DepthFirstSearch dfs, CFG cfg, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, ValueNumberDataflow vnaDataflow, AssertionMethods assertionMethods) Constructor.- Parameters:
rdfs- the reverse depth-first-search (for the block order)cfg- the CFG for the methodmethodGen- the MethodGen for the methodvnaDataflow-assertionMethods- AssertionMethods for the analyzed class
-
-
Method Details
-
toString
-
clearDerefsOnNonNullBranches
HACK: use the given is-null dataflow to clear deref sets for values that are known to be definitely non-null on a branch.- Parameters:
invDataflow- the IsNullValueDataflow to use
-
setTypeDataflow
-
isFactValid
Description copied from class:AbstractDataflowAnalysisDetermine whether the given fact is valid (neither top nor bottom).- Specified by:
isFactValidin classAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-
check
private static boolean check(org.apache.bcel.generic.InstructionHandle h, int[] opcodes) -
isNullCheck
public static boolean isNullCheck(org.apache.bcel.generic.InstructionHandle h, org.apache.bcel.generic.ConstantPoolGen cpg) -
handleNullCheck
private void handleNullCheck(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
reportPotentialDereference
public static boolean reportPotentialDereference(Location location, IsNullValueFrame invFrame) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
transferInstruction
public void transferInstruction(org.apache.bcel.generic.InstructionHandle handle, BasicBlock basicBlock, UnconditionalValueDerefSet fact) throws DataflowAnalysisException Description copied from class:AbstractDataflowAnalysisTransfer function for a single instruction.- Specified by:
transferInstructionin classAbstractDataflowAnalysis<UnconditionalValueDerefSet>- Parameters:
handle- the instructionbasicBlock- the BasicBlock containing the instruction; needed to disambiguate instructions in inlined JSR subroutinesfact- which should be modified based on the instruction- Throws:
DataflowAnalysisException
-
checkUnconditionalDerefDatabase
private void checkUnconditionalDerefDatabase(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) throws DataflowAnalysisException Check method call at given location to see if it unconditionally dereferences a parameter. Mark any such arguments as derefs.- Parameters:
location- the Location of the method callvnaFrame- ValueNumberFrame at the Locationfact- the dataflow value to modify- Throws:
DataflowAnalysisException
-
checkUnconditionalDerefDatabase
public static Set<ValueNumber> checkUnconditionalDerefDatabase(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, @CheckForNull IsNullValueFrame invFrame, TypeDataflow typeDataflow) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
checkNonNullReturnValue
private void checkNonNullReturnValue(XMethod thisMethod, Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) throws DataflowAnalysisException If this is a method call instruction, check to see if any of the parameters are @NonNull, and treat them as dereferences.- Parameters:
location- the Location of the instructionvnaFrame- the ValueNumberFrame at the Location of the instructionfact- the dataflow value to modify- Throws:
DataflowAnalysisException
-
checkNonNullPutField
private void checkNonNullPutField(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) throws DataflowAnalysisException If this is a putfield or putstatic instruction, check to see if the field is @NonNull, and treat it as dereferences.- Parameters:
location- the Location of the instructionvnaFrame- the ValueNumberFrame at the Location of the instructionfact- the dataflow value to modify- Throws:
DataflowAnalysisException
-
checkNonNullParams
private void checkNonNullParams(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) throws DataflowAnalysisException If this is a method call instruction, check to see if any of the parameters are @NonNull, and treat them as dereferences.- Parameters:
location- the Location of the instructionvnaFrame- the ValueNumberFrame at the Location of the instructionfact- the dataflow value to modify- Throws:
DataflowAnalysisException
-
checkAllNonNullParams
public static Set<ValueNumber> checkAllNonNullParams(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, @CheckForNull org.apache.bcel.classfile.Method method, @CheckForNull IsNullValueDataflow invDataflow, TypeDataflow typeDataflow) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
checkNonNullParams
public static Set<ValueNumber> checkNonNullParams(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, @CheckForNull org.apache.bcel.classfile.Method method, @CheckForNull IsNullValueFrame invFrame) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
checkInstance
private void checkInstance(Location location, ValueNumberFrame vnaFrame, UnconditionalValueDerefSet fact) throws DataflowAnalysisException Check to see if the instruction has a null check associated with it, and if so, add a dereference.- Parameters:
location- the Location of the instructionvnaFrame- ValueNumberFrame at the Location of the instructionfact- the dataflow value to modify- Throws:
DataflowAnalysisException
-
reportDereference
-
reportDereference
-
isAssertion
private boolean isAssertion(org.apache.bcel.generic.InstructionHandle handle) Return whether or not given instruction is an assertion.- Parameters:
handle- the instruction- Returns:
- true if instruction is an assertion, false otherwise
-
copy
Description copied from interface:DataflowAnalysisCopy dataflow facts. -
createFact
Description copied from interface:DataflowAnalysisCreate empty (uninitialized) dataflow facts for one program point. A valid value will be copied into it before it is used. -
initEntryFact
Description copied from interface:DataflowAnalysisInitialize the "entry" fact for the graph.- Throws:
DataflowAnalysisException
-
makeFactTop
Description copied from interface:DataflowAnalysisMake given fact the top value. -
isTop
Description copied from interface:DataflowAnalysisIs the given fact the top value. -
meetInto
public void meetInto(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result) throws DataflowAnalysisException Description copied from interface:DataflowAnalysisMeet a dataflow fact associated with an incoming edge into another fact. This is used to determine the start fact for a basic block.- Parameters:
fact- the predecessor fact (incoming edge)edge- the edge from the predecessorresult- the result fact- Throws:
DataflowAnalysisException
-
meetInto
public void meetInto(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result, boolean onlyEdge) -
propagateDerefSetsToMergeInputValues
private UnconditionalValueDerefSet propagateDerefSetsToMergeInputValues(UnconditionalValueDerefSet fact, Edge edge) Find out if any VNs in the source block contribute to unconditionally dereferenced VNs in the target block. If so, the VN in the source block is also unconditionally dereferenced, and we must propagate the target VN's dereferences.- Parameters:
fact- a dataflow valueedge- edge to check for merge input values- Returns:
- possibly-modified dataflow value
-
duplicateFact
Return a duplicate of given dataflow fact.- Parameters:
fact- a dataflow fact- Returns:
- a duplicate of the input dataflow fact
-
findValueKnownNonnullOnBranch
@CheckForNull private ValueNumber findValueKnownNonnullOnBranch(UnconditionalValueDerefSet fact, Edge edge) Clear deref sets of values if this edge is the non-null branch of an if comparison.- Parameters:
fact- a datflow factedge- edge to check- Returns:
- possibly-modified dataflow fact
-
isExceptionEdge
Determine whether dataflow should be propagated on given edge.- Parameters:
edge- the edge- Returns:
- true if dataflow should be propagated on the edge, false otherwise
-
same
Description copied from interface:DataflowAnalysisAre given dataflow facts the same? -
startIteration
public void startIteration()Description copied from interface:DataflowAnalysisCalled before beginning an iteration of analysis. Each iteration visits every basic block in the CFG.- Specified by:
startIterationin interfaceDataflowAnalysis<UnconditionalValueDerefSet>- Overrides:
startIterationin classBasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-
getLastUpdateTimestamp
- Specified by:
getLastUpdateTimestampin interfaceDataflowAnalysis<UnconditionalValueDerefSet>- Overrides:
getLastUpdateTimestampin classBasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-
setLastUpdateTimestamp
- Specified by:
setLastUpdateTimestampin interfaceDataflowAnalysis<UnconditionalValueDerefSet>- Overrides:
setLastUpdateTimestampin classBasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-