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
FieldsModifier and TypeFieldDescriptionstatic final booleanstatic final booleanstatic final booleanstatic final booleanstatic final booleanstatic final booleanstatic final boolean -
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 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) 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.intvoidInitialize the "entry" fact for the graph.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) 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 edu.umd.cs.findbugs.ba.BackwardDataflowAnalysis
getBlockOrder, getReverseDepthFirstSearch, isForwardsMethods inherited from class edu.umd.cs.findbugs.ba.AbstractDataflowAnalysis
getFactAfterLocation, getFactAtLocation, transferMethods 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:AbstractDataflowAnalysisDetermine whether the given fact is valid (neither top nor bottom).- Specified by:
isFactValidin 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: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
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: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) -
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>
-