Package edu.umd.cs.findbugs.ba.npe
Class IsNullValueAnalysis
- java.lang.Object
-
- edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis<Fact>
-
- edu.umd.cs.findbugs.ba.AbstractDataflowAnalysis<Fact>
-
- edu.umd.cs.findbugs.ba.ForwardDataflowAnalysis<FrameType>
-
- edu.umd.cs.findbugs.ba.FrameDataflowAnalysis<IsNullValue,IsNullValueFrame>
-
- edu.umd.cs.findbugs.ba.npe.IsNullValueAnalysis
-
- All Implemented Interfaces:
DataflowAnalysis<IsNullValueFrame>
,EdgeTypes
,IsNullValueAnalysisFeatures
public class IsNullValueAnalysis extends FrameDataflowAnalysis<IsNullValue,IsNullValueFrame> implements EdgeTypes, IsNullValueAnalysisFeatures
A dataflow analysis to detect potential null pointer dereferences.- Author:
- David Hovemeyer
- See Also:
IsNullValue
,IsNullValueFrame
,IsNullValueFrameModelingVisitor
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
IsNullValueAnalysis.PointerEqualityCheck
-
Field Summary
-
Fields inherited from interface edu.umd.cs.findbugs.ba.EdgeTypes
BACKEDGE_SOURCE_EDGE, BACKEDGE_TARGET_EDGE, CHECKED_EXCEPTIONS_FLAG, EXIT_EDGE, EXPLICIT_EXCEPTIONS_FLAG, FALL_THROUGH_EDGE, GOTO_EDGE, HANDLED_EXCEPTION_EDGE, IFCMP_EDGE, JSR_EDGE, RET_EDGE, RETURN_EDGE, START_EDGE, SWITCH_DEFAULT_EDGE, SWITCH_EDGE, UNHANDLED_EXCEPTION_EDGE, UNKNOWN_EDGE
-
Fields inherited from interface edu.umd.cs.findbugs.ba.npe.IsNullValueAnalysisFeatures
NCP_EXTRA_BRANCH, NO_SPLIT_DOWNGRADE_NSP, NO_SWITCH_DEFAULT_AS_EXCEPTION, UNKNOWN_VALUES_ARE_NSP, USE_TYPE_QUALIFIERS
-
-
Constructor Summary
Constructors Constructor Description IsNullValueAnalysis(MethodDescriptor descriptor, org.apache.bcel.generic.MethodGen methodGen, CFG cfg, ValueNumberDataflow vnaDataflow, TypeDataflow typeDataflow, DepthFirstSearch dfs, AssertionMethods assertionMethods)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addLocationWhereValueBecomesNull(LocationWhereValueBecomesNull locationWhereValueBecomesNull)
IsNullValueFrame
createFact()
Create empty (uninitialized) dataflow facts for one program point.void
endTransfer(BasicBlock basicBlock, org.apache.bcel.generic.InstructionHandle end, IsNullValueFrame result)
JavaClassAndMethod
getClassAndMethod()
IsNullValueFrame
getFactAtMidEdge(Edge edge)
static IsNullValueAnalysis.PointerEqualityCheck
getForPointerEqualityCheck(CFG cfg, ValueNumberDataflow vna)
java.util.Set<LocationWhereValueBecomesNull>
getLocationWhereValueBecomesNullSet()
void
initEntryFact(IsNullValueFrame result)
Initialize the "entry" fact for the graph.void
meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result)
Meet a dataflow fact associated with an incoming edge into another fact.void
meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result, boolean propagatePhiNodeInformation)
protected void
mergeInto(IsNullValueFrame other, IsNullValueFrame result)
Merge one frame into another.protected void
mergeValues(IsNullValueFrame otherFrame, IsNullValueFrame resultFrame, int slot)
Merge the values contained in a given slot of two Frames.void
setClassAndMethod(JavaClassAndMethod classAndMethod)
void
startIteration()
Called before beginning an iteration of analysis.void
startTransfer()
void
transfer(BasicBlock basicBlock, org.apache.bcel.generic.InstructionHandle end, IsNullValueFrame start, IsNullValueFrame result)
Transfer function for the analysis.void
transferInstruction(org.apache.bcel.generic.InstructionHandle handle, BasicBlock basicBlock, IsNullValueFrame fact)
Transfer function for a single instruction.-
Methods inherited from class edu.umd.cs.findbugs.ba.FrameDataflowAnalysis
copy, getFactAtPC, getFactBeforeExceptionCheck, getLastUpdateTimestamp, isFactValid, isTop, makeFactTop, modifyFrame, same, setLastUpdateTimestamp
-
Methods inherited from class edu.umd.cs.findbugs.ba.ForwardDataflowAnalysis
getBlockOrder, getDepthFirstSearch, isForwards
-
Methods inherited from class edu.umd.cs.findbugs.ba.AbstractDataflowAnalysis
getFactAfterLocation, getFactAtLocation
-
Methods inherited from class edu.umd.cs.findbugs.ba.BasicAbstractDataflowAnalysis
edgeTransfer, factToString, finishIteration, getFactOnEdge, getResultFact, getStartFact, resultFactIterator
-
-
-
-
Constructor Detail
-
IsNullValueAnalysis
public IsNullValueAnalysis(MethodDescriptor descriptor, org.apache.bcel.generic.MethodGen methodGen, CFG cfg, ValueNumberDataflow vnaDataflow, TypeDataflow typeDataflow, DepthFirstSearch dfs, AssertionMethods assertionMethods)
-
-
Method Detail
-
getForPointerEqualityCheck
@CheckForNull public static IsNullValueAnalysis.PointerEqualityCheck getForPointerEqualityCheck(CFG cfg, ValueNumberDataflow vna)
-
setClassAndMethod
public void setClassAndMethod(JavaClassAndMethod classAndMethod)
-
getClassAndMethod
public JavaClassAndMethod getClassAndMethod()
-
createFact
public IsNullValueFrame 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.- Specified by:
createFact
in interfaceDataflowAnalysis<IsNullValueFrame>
-
initEntryFact
public void initEntryFact(IsNullValueFrame result)
Description copied from interface:DataflowAnalysis
Initialize the "entry" fact for the graph.- Specified by:
initEntryFact
in interfaceDataflowAnalysis<IsNullValueFrame>
-
transfer
public void transfer(BasicBlock basicBlock, @CheckForNull org.apache.bcel.generic.InstructionHandle end, IsNullValueFrame start, IsNullValueFrame result) throws DataflowAnalysisException
Description copied from interface:DataflowAnalysis
Transfer function for the analysis. Taking dataflow facts at start (which might be either the entry or exit of the block, depending on whether the analysis is forwards or backwards), modify result to be the facts at the other end of the block.- Specified by:
transfer
in interfaceDataflowAnalysis<IsNullValueFrame>
- Overrides:
transfer
in classAbstractDataflowAnalysis<IsNullValueFrame>
- Parameters:
basicBlock
- the basic blockend
- if nonnull, stop before considering this instruction; otherwise, consider all of the instructions in the basic blockstart
- dataflow facts at beginning of block (if forward analysis) or end of block (if backwards analysis)result
- resulting dataflow facts at other end of block- Throws:
DataflowAnalysisException
-
startTransfer
public void startTransfer()
-
endTransfer
public void endTransfer(BasicBlock basicBlock, @CheckForNull org.apache.bcel.generic.InstructionHandle end, IsNullValueFrame result) throws DataflowAnalysisException
- Throws:
DataflowAnalysisException
-
transferInstruction
public void transferInstruction(org.apache.bcel.generic.InstructionHandle handle, BasicBlock basicBlock, IsNullValueFrame fact) throws DataflowAnalysisException
Description copied from class:AbstractDataflowAnalysis
Transfer function for a single instruction.- Specified by:
transferInstruction
in classAbstractDataflowAnalysis<IsNullValueFrame>
- 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
-
meetInto
public void meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame 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.- Specified by:
meetInto
in interfaceDataflowAnalysis<IsNullValueFrame>
- Parameters:
fact
- the predecessor fact (incoming edge)edge
- the edge from the predecessorresult
- the result fact- Throws:
DataflowAnalysisException
-
meetInto
public void meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result, boolean propagatePhiNodeInformation) throws DataflowAnalysisException
- Throws:
DataflowAnalysisException
-
mergeInto
protected void mergeInto(IsNullValueFrame other, IsNullValueFrame result) throws DataflowAnalysisException
Description copied from class:FrameDataflowAnalysis
Merge one frame into another.- Overrides:
mergeInto
in classFrameDataflowAnalysis<IsNullValue,IsNullValueFrame>
- Parameters:
other
- the frame to merge with the resultresult
- the result frame, which is modified to be the merge of the two frames- Throws:
DataflowAnalysisException
-
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<IsNullValueFrame>
- Overrides:
startIteration
in classBasicAbstractDataflowAnalysis<IsNullValueFrame>
-
addLocationWhereValueBecomesNull
public void addLocationWhereValueBecomesNull(LocationWhereValueBecomesNull locationWhereValueBecomesNull)
-
getLocationWhereValueBecomesNullSet
public java.util.Set<LocationWhereValueBecomesNull> getLocationWhereValueBecomesNullSet()
-
mergeValues
protected void mergeValues(IsNullValueFrame otherFrame, IsNullValueFrame resultFrame, int slot) throws DataflowAnalysisException
Description copied from class:FrameDataflowAnalysis
Merge the values contained in a given slot of two Frames.- Specified by:
mergeValues
in classFrameDataflowAnalysis<IsNullValue,IsNullValueFrame>
- Parameters:
otherFrame
- a FrameresultFrame
- a Frame which will contain the resulting merged valueslot
- a slot in both frames- Throws:
DataflowAnalysisException
-
getFactAtMidEdge
public IsNullValueFrame getFactAtMidEdge(Edge edge) throws DataflowAnalysisException
- Throws:
DataflowAnalysisException
-
-