Package edu.umd.cs.findbugs.ba.deref
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.
- Author:
- David Hovemeyer
-
Field Summary
Modifier and TypeFieldDescriptionstatic final boolean
static final boolean
static final boolean
static final boolean
static final boolean
static final boolean
static final boolean
-
Constructor Summary
ConstructorDescriptionUnconditionalValueDerefAnalysis
(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 TypeMethodDescriptionstatic Set
<ValueNumber> checkAllNonNullParams
(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, org.apache.bcel.classfile.Method method, IsNullValueDataflow invDataflow, TypeDataflow typeDataflow) static Set
<ValueNumber> checkNonNullParams
(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, org.apache.bcel.classfile.Method method, IsNullValueFrame invFrame) static Set
<ValueNumber> checkUnconditionalDerefDatabase
(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, IsNullValueFrame invFrame, TypeDataflow typeDataflow) void
clearDerefsOnNonNullBranches
(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.void
copy
(UnconditionalValueDerefSet source, UnconditionalValueDerefSet dest) Copy dataflow facts.Create empty (uninitialized) dataflow facts for one program point.int
void
Initialize the "entry" fact for the graph.boolean
Determine whether the given fact is valid (neither top nor bottom).static boolean
isNullCheck
(org.apache.bcel.generic.InstructionHandle h, org.apache.bcel.generic.ConstantPoolGen cpg) boolean
Is the given fact the top value.void
Make given fact the top value.void
meetInto
(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result) Meet a dataflow fact associated with an incoming edge into another fact.void
meetInto
(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result, boolean onlyEdge) static boolean
reportPotentialDereference
(Location location, IsNullValueFrame invFrame) boolean
same
(UnconditionalValueDerefSet fact1, UnconditionalValueDerefSet fact2) Are given dataflow facts the same?void
setLastUpdateTimestamp
(UnconditionalValueDerefSet fact, int lastUpdate) void
setTypeDataflow
(TypeDataflow typeDataflow) void
Called before beginning an iteration of analysis.toString()
void
transferInstruction
(org.apache.bcel.generic.InstructionHandle handle, BasicBlock basicBlock, UnconditionalValueDerefSet fact) Transfer function for a single instruction.Methods inherited from class edu.umd.cs.findbugs.ba.BackwardDataflowAnalysis
getBlockOrder, getReverseDepthFirstSearch, isForwards
Methods inherited from class edu.umd.cs.findbugs.ba.AbstractDataflowAnalysis
getFactAfterLocation, getFactAtLocation, transfer
Methods inherited from class edu.umd.cs.findbugs.ba.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 -
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:AbstractDataflowAnalysis
Determine whether the given fact is valid (neither top nor bottom).- Specified by:
isFactValid
in classAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-
isNullCheck
public static boolean isNullCheck(org.apache.bcel.generic.InstructionHandle h, org.apache.bcel.generic.ConstantPoolGen cpg) -
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:AbstractDataflowAnalysis
Transfer function for a single instruction.- Specified by:
transferInstruction
in 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
public static Set<ValueNumber> checkUnconditionalDerefDatabase(Location location, ValueNumberFrame vnaFrame, org.apache.bcel.generic.ConstantPoolGen constantPool, @CheckForNull IsNullValueFrame invFrame, TypeDataflow typeDataflow) throws DataflowAnalysisException - 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
-
copy
Description copied from interface:DataflowAnalysis
Copy dataflow facts. -
createFact
Description copied from interface:DataflowAnalysis
Create 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:DataflowAnalysis
Initialize the "entry" fact for the graph.- Throws:
DataflowAnalysisException
-
makeFactTop
Description copied from interface:DataflowAnalysis
Make given fact the top value. -
isTop
Description copied from interface:DataflowAnalysis
Is the given fact the top value. -
meetInto
public void meetInto(UnconditionalValueDerefSet fact, Edge edge, UnconditionalValueDerefSet result) throws DataflowAnalysisException Description copied from interface:DataflowAnalysis
Meet 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) -
same
Description copied from interface:DataflowAnalysis
Are given dataflow facts the same? -
startIteration
public void startIteration()Description copied from interface:DataflowAnalysis
Called before beginning an iteration of analysis. Each iteration visits every basic block in the CFG.- Specified by:
startIteration
in interfaceDataflowAnalysis<UnconditionalValueDerefSet>
- Overrides:
startIteration
in classBasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-
getLastUpdateTimestamp
- Specified by:
getLastUpdateTimestamp
in interfaceDataflowAnalysis<UnconditionalValueDerefSet>
- Overrides:
getLastUpdateTimestamp
in classBasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-
setLastUpdateTimestamp
- Specified by:
setLastUpdateTimestamp
in interfaceDataflowAnalysis<UnconditionalValueDerefSet>
- Overrides:
setLastUpdateTimestamp
in classBasicAbstractDataflowAnalysis<UnconditionalValueDerefSet>
-