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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classIsNullValueAnalysis.PointerEqualityCheck(package private) static classIsNullValueAnalysis.PointerEqualityCheckState
-
Field Summary
Fields Modifier and Type Field Description private IsNullValueFramecachedEntryFactprivate CFGcfgprivate JavaClassAndMethodclassAndMethod(package private) static booleanDEBUGprivate IsNullValueFrameinstanceOfFrameprivate IsNullValueFramelastFrameprivate java.util.Set<LocationWhereValueBecomesNull>locationWhereValueBecomesNullSetprivate org.apache.bcel.generic.MethodGenmethodGenprivate static java.util.BitSetnullComparisonInstructionSetprivate IsNullValueAnalysis.PointerEqualityCheckpointerEqualityCheckprivate booleantrackValueNumbersprivate IsNullValueFrameModelingVisitorvisitorprivate ValueNumberDataflowvnaDataflow-
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 voidaddLocationWhereValueBecomesNull(LocationWhereValueBecomesNull locationWhereValueBecomesNull)IsNullValueFramecreateFact()Create empty (uninitialized) dataflow facts for one program point.voidendTransfer(BasicBlock basicBlock, org.apache.bcel.generic.InstructionHandle end, IsNullValueFrame result)JavaClassAndMethodgetClassAndMethod()private IsNullConditionDecisiongetDecision(BasicBlock basicBlock, IsNullValueFrame lastFrame)Determine if the given basic block ends in a redundant null comparison.IsNullValueFramegetFactAtMidEdge(Edge edge)static IsNullValueAnalysis.PointerEqualityCheckgetForPointerEqualityCheck(CFG cfg, ValueNumberDataflow vna)private ValueNumbergetKnownNonnullDueToPointerDisequality(ValueNumber knownNull, int pc)java.util.Set<LocationWhereValueBecomesNull>getLocationWhereValueBecomesNullSet()private IsNullConditionDecisionhandleIfNull(IsNullValue tos, ValueNumber prevTopValue, boolean ifnull)voidinitEntryFact(IsNullValueFrame result)Initialize the "entry" fact for the graph.voidmeetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result)Meet a dataflow fact associated with an incoming edge into another fact.voidmeetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result, boolean propagatePhiNodeInformation)protected voidmergeInto(IsNullValueFrame other, IsNullValueFrame result)Merge one frame into another.protected voidmergeValues(IsNullValueFrame otherFrame, IsNullValueFrame resultFrame, int slot)Merge the values contained in a given slot of two Frames.private IsNullValueFramereplaceValues(IsNullValueFrame origFrame, IsNullValueFrame frame, ValueNumber replaceMe, ValueNumberFrame prevVnaFrame, ValueNumberFrame targetVnaFrame, IsNullValue replacementValue)Update is-null information at a branch target based on information gained at a null comparison branch.voidsetClassAndMethod(JavaClassAndMethod classAndMethod)voidstartIteration()Called before beginning an iteration of analysis.voidstartTransfer()voidtransfer(BasicBlock basicBlock, org.apache.bcel.generic.InstructionHandle end, IsNullValueFrame start, IsNullValueFrame result)Transfer function for the analysis.voidtransferInstruction(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
-
-
-
-
Field Detail
-
DEBUG
static final boolean DEBUG
-
methodGen
private final org.apache.bcel.generic.MethodGen methodGen
-
visitor
private final IsNullValueFrameModelingVisitor visitor
-
vnaDataflow
private final ValueNumberDataflow vnaDataflow
-
cfg
private final CFG cfg
-
locationWhereValueBecomesNullSet
private final java.util.Set<LocationWhereValueBecomesNull> locationWhereValueBecomesNullSet
-
trackValueNumbers
private final boolean trackValueNumbers
-
lastFrame
private IsNullValueFrame lastFrame
-
instanceOfFrame
private IsNullValueFrame instanceOfFrame
-
cachedEntryFact
private IsNullValueFrame cachedEntryFact
-
classAndMethod
private JavaClassAndMethod classAndMethod
-
pointerEqualityCheck
@CheckForNull private final IsNullValueAnalysis.PointerEqualityCheck pointerEqualityCheck
-
nullComparisonInstructionSet
private static final java.util.BitSet nullComparisonInstructionSet
-
-
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)
-
getKnownNonnullDueToPointerDisequality
@CheckForNull private ValueNumber getKnownNonnullDueToPointerDisequality(ValueNumber knownNull, int pc)
-
setClassAndMethod
public void setClassAndMethod(JavaClassAndMethod classAndMethod)
-
getClassAndMethod
public JavaClassAndMethod getClassAndMethod()
-
createFact
public IsNullValueFrame 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.- Specified by:
createFactin interfaceDataflowAnalysis<IsNullValueFrame>
-
initEntryFact
public void initEntryFact(IsNullValueFrame result)
Description copied from interface:DataflowAnalysisInitialize the "entry" fact for the graph.- Specified by:
initEntryFactin 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:DataflowAnalysisTransfer 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:
transferin interfaceDataflowAnalysis<IsNullValueFrame>- Overrides:
transferin 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 DataflowAnalysisExceptionDescription copied from class:AbstractDataflowAnalysisTransfer function for a single instruction.- Specified by:
transferInstructionin 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:DataflowAnalysisMeet 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:
meetIntoin 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:FrameDataflowAnalysisMerge one frame into another.- Overrides:
mergeIntoin 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:DataflowAnalysisCalled before beginning an iteration of analysis. Each iteration visits every basic block in the CFG.- Specified by:
startIterationin interfaceDataflowAnalysis<IsNullValueFrame>- Overrides:
startIterationin 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:FrameDataflowAnalysisMerge the values contained in a given slot of two Frames.- Specified by:
mergeValuesin classFrameDataflowAnalysis<IsNullValue,IsNullValueFrame>- Parameters:
otherFrame- a FrameresultFrame- a Frame which will contain the resulting merged valueslot- a slot in both frames- Throws:
DataflowAnalysisException
-
getDecision
private IsNullConditionDecision getDecision(BasicBlock basicBlock, IsNullValueFrame lastFrame) throws DataflowAnalysisException
Determine if the given basic block ends in a redundant null comparison.- Parameters:
basicBlock- the basic blocklastFrame- the IsNullValueFrame representing values at the final instruction of the block- Returns:
- an IsNullConditionDecision object representing the is-null information gained about the compared value, or null if no information is gained
- Throws:
DataflowAnalysisException
-
handleIfNull
private IsNullConditionDecision handleIfNull(IsNullValue tos, ValueNumber prevTopValue, boolean ifnull)
-
replaceValues
private IsNullValueFrame replaceValues(IsNullValueFrame origFrame, IsNullValueFrame frame, ValueNumber replaceMe, ValueNumberFrame prevVnaFrame, ValueNumberFrame targetVnaFrame, IsNullValue replacementValue)
Update is-null information at a branch target based on information gained at a null comparison branch.- Parameters:
origFrame- the original is-null frame at entry to basic blockframe- the modified version of the is-null entry frame; null if the entry frame has not been modified yetreplaceMe- the ValueNumber in the value number frame at the if comparison whose is-null information will be updatedprevVnaFrame- the ValueNumberFrame at the if comparisontargetVnaFrame- the ValueNumberFrame at entry to the basic blockreplacementValue- the IsNullValue representing the updated is-null information- Returns:
- a modified IsNullValueFrame with updated is-null information
-
getFactAtMidEdge
public IsNullValueFrame getFactAtMidEdge(Edge edge) throws DataflowAnalysisException
- Throws:
DataflowAnalysisException
-
-