Package edu.umd.cs.findbugs.detect
Class FindRefComparison
java.lang.Object
edu.umd.cs.findbugs.detect.FindRefComparison
- All Implemented Interfaces:
ExtendedTypes
,Detector
,Priorities
Find suspicious reference comparisons. This includes:
- Strings and other java.lang objects compared by reference equality
- Calls to equals(Object) where the argument is a different type than the receiver object
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
Type representing a dynamically created String.static class
static class
static class
Type representing a String passed as a parameter.private static class
private static class
Type merger to use the extended String types.private static final class
static class
Type representing a static String.private static interface
private static class
A BugInstance and its WarningPropertySet. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final int
private final BugAccumulator
private final BugReporter
private ClassContext
private static final boolean
Classes that are suspicious if compared by reference.private static final org.apache.bcel.generic.Type
private static final org.apache.bcel.generic.Type
private static final BitSet
Set of opcodes that invoke instance methods on an object.private static final org.apache.bcel.generic.Type
private static final BitSet
Set of bytecodes using for prescreening.private static final org.apache.bcel.generic.Type
private static final String
private static final byte
private static final byte
private static final byte
private final boolean
Fields inherited from interface edu.umd.cs.findbugs.ba.type.ExtendedTypes
T_AVAIL_TYPE, T_BOTTOM, T_DOUBLE_EXTRA, T_EXCEPTION, T_LONG_EXTRA, T_NULL, T_TOP
Fields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) void
addEqualsCheck
(String type, int pc) private void
analyzeMethod
(ClassContext classContext, org.apache.bcel.classfile.Method method) private void
checkEqualsComparison
(Location location, org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow) private boolean
checkForWeirdEquals
(String lhsSig, String rhsSig, Set<XMethod> targets) private void
checkRefComparison
(Location location, org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, TypeDataflow typeDataflow, List<FindRefComparison.WarningWithProperties> stringComparisonList, List<FindRefComparison.WarningWithProperties> refComparisonList) private static boolean
comparingClasses
(org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) private static boolean
comparingEnumsSameType
(org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) private void
decorateWarnings
(LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.WarningDecorator warningDecorator) getInvokedMethod
(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv) getMethodCalledAnnotation
(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv) private void
handleStringComparison
(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, List<FindRefComparison.WarningWithProperties> stringComparisonList, Location location, org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) private void
handleSuspiciousRefComparison
(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, List<FindRefComparison.WarningWithProperties> refComparisonList, Location location, String lhs, org.apache.bcel.generic.ReferenceType lhsType, org.apache.bcel.generic.ReferenceType rhsType, Optional<Integer> priorityOverride) private void
inspectLocation
(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, LinkedList<FindRefComparison.WarningWithProperties> refComparisonList, LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, TypeDataflow typeDataflow, Location location) private static boolean
isClassType
(org.apache.bcel.generic.Type type) private static boolean
isComparisonInsideEqualsMethod
(org.apache.bcel.classfile.JavaClass jClass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) Identifies if it's a comparison of two instances of the class inside its equals method or if it's a comparison of the class with Object.private boolean
isLombokWithMethod
(org.apache.bcel.classfile.Method method) Lombok's "with" methods include an == comparison reported as RC_REF_COMPARISON.(package private) boolean
void
report()
This method is called after all classes to be visited.private boolean
private void
reportBest
(ClassContext classContext, org.apache.bcel.classfile.Method method, LinkedList<FindRefComparison.WarningWithProperties> warningList, boolean relaxed) private static org.apache.bcel.classfile.JavaClass
resolveJavaClass
(org.apache.bcel.generic.Type type) void
visitClassContext
(ClassContext classContext) Visit the ClassContext for a class which should be analyzed for instances of bug patterns.
-
Field Details
-
DEBUG
private static final boolean DEBUG -
BASE_ES_PRIORITY
private static final int BASE_ES_PRIORITY -
DEFAULT_SUSPICIOUS_SET
Classes that are suspicious if compared by reference. -
invokeInstanceSet
Set of opcodes that invoke instance methods on an object. -
prescreenSet
Set of bytecodes using for prescreening. -
T_DYNAMIC_STRING
private static final byte T_DYNAMIC_STRING- See Also:
-
T_STATIC_STRING
private static final byte T_STATIC_STRING- See Also:
-
T_PARAMETER_STRING
private static final byte T_PARAMETER_STRING- See Also:
-
STRING_SIGNATURE
- See Also:
-
dynamicStringTypeInstance
private static final org.apache.bcel.generic.Type dynamicStringTypeInstance -
staticStringTypeInstance
private static final org.apache.bcel.generic.Type staticStringTypeInstance -
emptyStringTypeInstance
private static final org.apache.bcel.generic.Type emptyStringTypeInstance -
parameterStringTypeInstance
private static final org.apache.bcel.generic.Type parameterStringTypeInstance -
bugReporter
-
bugAccumulator
-
classContext
-
suspiciousSet
-
testingEnabled
private final boolean testingEnabled -
comparedForEqualityInThisMethod
-
-
Constructor Details
-
FindRefComparison
-
-
Method Details
-
reportAllRefComparisons
private boolean reportAllRefComparisons() -
visitClassContext
Description copied from interface:Detector
Visit the ClassContext for a class which should be analyzed for instances of bug patterns.- Specified by:
visitClassContext
in interfaceDetector
- Parameters:
classContext
- the ClassContext
-
isLombokWithMethod
private boolean isLombokWithMethod(org.apache.bcel.classfile.Method method) Lombok's "with" methods include an == comparison reported as RC_REF_COMPARISON.- Returns:
true
if the method is generated with Lombok's@With
annotation
-
analyzeMethod
private void analyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method) throws CFGBuilderException, DataflowAnalysisException -
mightBeLaterCheckedUsingEquals
-
inspectLocation
private void inspectLocation(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, LinkedList<FindRefComparison.WarningWithProperties> refComparisonList, LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, TypeDataflow typeDataflow, Location location) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
decorateWarnings
private void decorateWarnings(LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.WarningDecorator warningDecorator) -
reportBest
private void reportBest(ClassContext classContext, org.apache.bcel.classfile.Method method, LinkedList<FindRefComparison.WarningWithProperties> warningList, boolean relaxed) -
isComparisonInsideEqualsMethod
private static boolean isComparisonInsideEqualsMethod(org.apache.bcel.classfile.JavaClass jClass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) Identifies if it's a comparison of two instances of the class inside its equals method or if it's a comparison of the class with Object. This should be OK as this is usually an optimization inside the equals method.- Parameters:
jClass
- : the class where this check is running onmethod
- : the method where the comparison is happeninglhsType
- : the type of the left hand side of the comparisonrhsType
- : the type of the right hand side of the comparison- Returns:
- whether it's an acceptable comparison inside the equals method
-
checkRefComparison
private void checkRefComparison(Location location, org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, TypeDataflow typeDataflow, List<FindRefComparison.WarningWithProperties> stringComparisonList, List<FindRefComparison.WarningWithProperties> refComparisonList) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
comparingEnumsSameType
private static boolean comparingEnumsSameType(org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) -
resolveJavaClass
private static org.apache.bcel.classfile.JavaClass resolveJavaClass(org.apache.bcel.generic.Type type) -
comparingClasses
private static boolean comparingClasses(org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) -
isClassType
private static boolean isClassType(org.apache.bcel.generic.Type type) -
handleStringComparison
private void handleStringComparison(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, List<FindRefComparison.WarningWithProperties> stringComparisonList, Location location, org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType) -
handleSuspiciousRefComparison
private void handleSuspiciousRefComparison(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, List<FindRefComparison.WarningWithProperties> refComparisonList, Location location, String lhs, org.apache.bcel.generic.ReferenceType lhsType, org.apache.bcel.generic.ReferenceType rhsType, Optional<Integer> priorityOverride) -
addEqualsCheck
-
checkEqualsComparison
private void checkEqualsComparison(Location location, org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, org.apache.bcel.generic.ConstantPoolGen cpg, TypeDataflow typeDataflow) throws DataflowAnalysisException - Throws:
DataflowAnalysisException
-
getMethodCalledAnnotation
@CheckForNull public MethodAnnotation getMethodCalledAnnotation(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv) -
getInvokedMethod
public MethodDescriptor getInvokedMethod(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv) -
checkForWeirdEquals
-
report
public void report()Description copied from interface:Detector
This method is called after all classes to be visited. It should be used by any detectors which accumulate information over all visited classes to generate results.
-