Class FindNullDeref
java.lang.Object
edu.umd.cs.findbugs.detect.FindNullDeref
- All Implemented Interfaces:
NullDerefAndRedundantComparisonCollector, Detector, Priorities, UseAnnotationDatabase
public class FindNullDeref
extends Object
implements Detector, UseAnnotationDatabase, NullDerefAndRedundantComparisonCollector
A Detector to find instructions where a NullPointerException might be raised.
We also look for useless reference comparisons involving null and non-null
values.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static class -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BugAccumulatorprivate final BugReporterprivate booleanprivate static final Stringprivate ClassContextstatic final booleanprivate static final booleanprivate static final booleanprivate IsNullValueDataflowprivate final org.slf4j.Loggerprivate static final booleanprivate org.apache.bcel.classfile.Methodprivate static final Stringprivate NullnessAnnotationprivate BitSetprivate ValueNumberDataflowFields inherited from interface Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate voidaddParamAnnotations(Location location, BitSet definitelyNullArgSet, BitSet violatedParamSet, WarningPropertySet<? super NullArgumentWarningProperty> propertySet, BugInstance warning) private voidaddPropertiesForDereferenceLocations(WarningPropertySet<WarningProperty> propertySet, Collection<Location> derefLocationSet, boolean isConsistent) private voidprivate voidanalyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method) (package private) booleanstatic booleancatchesNull(org.apache.bcel.classfile.ConstantPool constantPool, org.apache.bcel.classfile.Code code, Location location) private voidprivate voidCheck whether the various interprocedural databases we can use exist and are nonempty.private voidcheckNonNullParam(Location location, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow, org.apache.bcel.generic.InvokeInstruction invokeInstruction, BitSet nullArgSet, BitSet definitelyNullArgSet) We have a method invocation in which a possibly or definitely null parameter is passed.private voidcheckUnconditionallyDereferencedParam(Location location, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow, org.apache.bcel.generic.InvokeInstruction invokeInstruction, BitSet nullArgSet, BitSet definitelyNullArgSet) private voiddecorateWarning(Location location, WarningPropertySet<WarningProperty> propertySet, BugInstance warning) private voidexamineCallSite(Location location, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow) private voidexaminePutfieldInstruction(Location location, org.apache.bcel.generic.PUTFIELD ins, org.apache.bcel.generic.ConstantPoolGen cpg) private voidexamineReturnInstruction(Location location) private BitSetFind set of blocks which were known to be dead before doing the null pointer analysis.voidfoundGuaranteedNullDeref(Set<Location> assignedNullLocationSet, Set<Location> derefLocationSet, SortedSet<Location> doomedLocations, ValueNumberDataflow vna, ValueNumber refValue, BugAnnotation variableAnnotation, NullValueUnconditionalDeref deref, boolean npeIfStatementCovered) Subclasses should override this method to capture values assigned null (or that become null through a comparison and branch) that are guaranteed to reach a dereference (ignoring implicit exception paths).voidfoundNullDeref(Location location, ValueNumber valueNumber, IsNullValue refValue, ValueNumberFrame vnaFrame) Deprecated.voidfoundNullDeref(Location location, ValueNumber valueNumber, IsNullValue refValue, ValueNumberFrame vnaFrame, boolean isConsistent) Subclasses should override this method to capture locations where a null pointer is dereferenced.voidfoundRedundantNullCheck(Location location, RedundantBranch redundantBranch) Subclasses should override this method to capture locations where a redundant null comparison is performed.private StringgetDescription(Location loc, ValueNumber refValue) private NullnessAnnotationSee if the currently-visited method declares a(package private) BugAnnotationgetVariableAnnotation(Location location) private booleanhasManyPreceedingNullTests(int pc) private booleanprivate booleanprivate booleanbooleanisDuplicated(WarningPropertySet<WarningProperty> propertySet, int pc, boolean isConsistent) static booleanisGeneratedCodeInCatchBlock(org.apache.bcel.classfile.Method method, int pc) Java 11+ compiler generates redundant null checks for try-with-resources.private static booleanisGeneratedCodeInCatchBlockViaLineNumber(org.apache.bcel.classfile.ConstantPool cp, org.apache.bcel.classfile.LineNumberTable lineNumberTable, int line, org.apache.bcel.generic.InstructionList instructions, List<org.apache.bcel.classfile.CodeException> throwables) Java 11+ compiler generates redundant null checks for try-with-resources.private booleanisGoto(org.apache.bcel.generic.Instruction instruction) Determine whether the given instruction is a goto.static booleanisThrower(BasicBlock target) (package private) intmaxPC(Collection<Location> locs) (package private) intminPC(Collection<Location> locs) voidreport()This method is called after all classes to be visited.private voidreportNullDeref(WarningPropertySet<WarningProperty> propertySet, Location location, String type, int priority, BugAnnotation variable) private booleansafeCallToPrimateParseMethod(XMethod calledMethod, Location location) private booleanprivate booleanuniqueLocations(Collection<Location> derefLocationSet) voidvisitClassContext(ClassContext classContext) Visit the ClassContext for a class which should be analyzed for instances of bug patterns.
-
Field Details
-
log
private final org.slf4j.Logger log -
DEBUG
public static final boolean DEBUG -
DEBUG_NULLARG
private static final boolean DEBUG_NULLARG -
DEBUG_NULLRETURN
private static final boolean DEBUG_NULLRETURN -
MARK_DOOMED
private static final boolean MARK_DOOMED -
METHOD_NAME
-
CLASS
-
bugReporter
-
bugAccumulator
-
unconditionalDerefParamDatabase
-
checkedDatabases
private boolean checkedDatabases -
classContext
-
method
private org.apache.bcel.classfile.Method method -
invDataflow
-
vnaDataflow
-
previouslyDeadBlocks
-
methodAnnotation
-
catchTypesForNull
-
-
Constructor Details
-
FindNullDeref
-
-
Method Details
-
visitClassContext
Description copied from interface:DetectorVisit the ClassContext for a class which should be analyzed for instances of bug patterns.- Specified by:
visitClassContextin interfaceDetector- Parameters:
classContext- the ClassContext
-
analyzeMethod
private void analyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method) throws DataflowAnalysisException, CFGBuilderException -
findPreviouslyDeadBlocks
Find set of blocks which were known to be dead before doing the null pointer analysis.- Returns:
- set of previously dead blocks, indexed by block id
- Throws:
CFGBuilderExceptionDataflowAnalysisException
-
checkDatabases
private void checkDatabases()Check whether the various interprocedural databases we can use exist and are nonempty. -
getMethodNullnessAnnotation
See if the currently-visited method declares a -
checkCallSitesAndReturnInstructions
private void checkCallSitesAndReturnInstructions() -
examineCallSite
private void examineCallSite(Location location, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow) throws DataflowAnalysisException, CFGBuilderException, ClassNotFoundException -
examinePutfieldInstruction
private void examinePutfieldInstruction(Location location, org.apache.bcel.generic.PUTFIELD ins, org.apache.bcel.generic.ConstantPoolGen cpg) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
examineReturnInstruction
private void examineReturnInstruction(Location location) throws DataflowAnalysisException, CFGBuilderException -
hasManyPreceedingNullTests
private boolean hasManyPreceedingNullTests(int pc) -
catchesNull
public static boolean catchesNull(org.apache.bcel.classfile.ConstantPool constantPool, org.apache.bcel.classfile.Code code, Location location) -
safeCallToPrimateParseMethod
-
checkUnconditionallyDereferencedParam
private void checkUnconditionallyDereferencedParam(Location location, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow, org.apache.bcel.generic.InvokeInstruction invokeInstruction, BitSet nullArgSet, BitSet definitelyNullArgSet) throws DataflowAnalysisException, ClassNotFoundException -
decorateWarning
private void decorateWarning(Location location, WarningPropertySet<WarningProperty> propertySet, BugInstance warning) -
addParamAnnotations
private void addParamAnnotations(Location location, BitSet definitelyNullArgSet, BitSet violatedParamSet, WarningPropertySet<? super NullArgumentWarningProperty> propertySet, BugInstance warning) -
checkNonNullParam
private void checkNonNullParam(Location location, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow, org.apache.bcel.generic.InvokeInstruction invokeInstruction, BitSet nullArgSet, BitSet definitelyNullArgSet) We have a method invocation in which a possibly or definitely null parameter is passed. Check it against the library of nonnull annotations.- Parameters:
location-cpg-typeDataflow-invokeInstruction-nullArgSet-definitelyNullArgSet-
-
report
-
skipIfInsideCatchNull
private boolean skipIfInsideCatchNull() -
foundNullDeref
@Deprecated public void foundNullDeref(Location location, ValueNumber valueNumber, IsNullValue refValue, ValueNumberFrame vnaFrame) Deprecated.Description copied from interface:NullDerefAndRedundantComparisonCollectorSubclasses should override this method to capture locations where a null pointer is dereferenced.- Specified by:
foundNullDerefin interfaceNullDerefAndRedundantComparisonCollector- Parameters:
location- the Location of the null dereferencevalueNumber- the ValueNumber of the possibly-null valuerefValue- the kind of possibly-null value dereferencedvnaFrame- The ValueNumber Frame at the point where the dereference occurred
-
foundNullDeref
public void foundNullDeref(Location location, ValueNumber valueNumber, IsNullValue refValue, ValueNumberFrame vnaFrame, boolean isConsistent) Description copied from interface:NullDerefAndRedundantComparisonCollectorSubclasses should override this method to capture locations where a null pointer is dereferenced.- Specified by:
foundNullDerefin interfaceNullDerefAndRedundantComparisonCollector- Parameters:
location- the Location of the null dereferencevalueNumber- the ValueNumber of the possibly-null valuerefValue- the kind of possibly-null value dereferencedvnaFrame- The ValueNumber Frame at the point where the dereference occurredisConsistent- true if the refValue is identical at all clones of the same instruction
-
isDuplicated
public boolean isDuplicated(WarningPropertySet<WarningProperty> propertySet, int pc, boolean isConsistent) -
reportNullDeref
private void reportNullDeref(WarningPropertySet<WarningProperty> propertySet, Location location, String type, int priority, @CheckForNull BugAnnotation variable) -
isThrower
-
foundRedundantNullCheck
Description copied from interface:NullDerefAndRedundantComparisonCollectorSubclasses should override this method to capture locations where a redundant null comparison is performed.- Specified by:
foundRedundantNullCheckin interfaceNullDerefAndRedundantComparisonCollector- Parameters:
location- the Location of the redundant null checkredundantBranch- the RedundantBranch
-
getVariableAnnotation
-
isGoto
private boolean isGoto(org.apache.bcel.generic.Instruction instruction) Determine whether the given instruction is a goto.- Parameters:
instruction- the instruction- Returns:
- true if the instruction is a goto, false otherwise
-
minPC
-
maxPC
-
callToAssertionMethod
-
foundGuaranteedNullDeref
public void foundGuaranteedNullDeref(@Nonnull Set<Location> assignedNullLocationSet, @Nonnull Set<Location> derefLocationSet, SortedSet<Location> doomedLocations, ValueNumberDataflow vna, ValueNumber refValue, @CheckForNull BugAnnotation variableAnnotation, NullValueUnconditionalDeref deref, boolean npeIfStatementCovered) Description copied from interface:NullDerefAndRedundantComparisonCollectorSubclasses should override this method to capture values assigned null (or that become null through a comparison and branch) that are guaranteed to reach a dereference (ignoring implicit exception paths).- Specified by:
foundGuaranteedNullDerefin interfaceNullDerefAndRedundantComparisonCollector- Parameters:
assignedNullLocationSet- set of locations where the value becomes nullderefLocationSet- set of locations where dereferences occurdoomedLocations- locations at which the value is doomedvna- ValueNumberDataflowrefValue- the null valuevariableAnnotation- TODOderef- TODOnpeIfStatementCovered- true if doom location is a statement
-
addPropertiesForDereferenceLocations
private void addPropertiesForDereferenceLocations(WarningPropertySet<WarningProperty> propertySet, Collection<Location> derefLocationSet, boolean isConsistent) -
uniqueLocations
-
addPropertiesForMethodContainingWarning
private void addPropertiesForMethodContainingWarning(WarningPropertySet<WarningProperty> propertySet) -
isDoomed
-
getDescription
-
inExplicitCatchNullBlock
-
inIndirectCatchNullBlock
-
isGeneratedCodeInCatchBlock
public static boolean isGeneratedCodeInCatchBlock(@NonNull org.apache.bcel.classfile.Method method, int pc) Java 11+ compiler generates redundant null checks for try-with-resources. This method detects theifnullbytecode generated by javac, to help the detector to avoid to report needlessRCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUEbug.- Parameters:
method- the methodpc- the program counter- Returns:
- true if the pc specifies redundant null check generated by javac
- See Also:
-
isGeneratedCodeInCatchBlockViaLineNumber
private static boolean isGeneratedCodeInCatchBlockViaLineNumber(@NonNull org.apache.bcel.classfile.ConstantPool cp, @NonNull org.apache.bcel.classfile.LineNumberTable lineNumberTable, int line, @NonNull org.apache.bcel.generic.InstructionList instructions, @NonNull List<org.apache.bcel.classfile.CodeException> throwables) Java 11+ compiler generates redundant null checks for try-with-resources. This method tries to distinguish such code from manually written code by analysing null numbers.- Parameters:
cp- the constant poollineNumberTable- the table with the line numbersline- the line which belongs to the program counterinstructions- the list of instructionsthrowables- the list of Throwables in this method- Returns:
- true if the pc specifies redundant null check generated by javac
-
foundNullDeref(Location,ValueNumber,IsNullValue,ValueNumberFrame,boolean)instead