Package edu.umd.cs.findbugs.detect
Class FindRefComparison
- java.lang.Object
-
- edu.umd.cs.findbugs.detect.FindRefComparison
-
- All Implemented Interfaces:
ExtendedTypes,Detector,Priorities
public class FindRefComparison extends java.lang.Object implements Detector, ExtendedTypes
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 Classes Modifier and Type Class Description static classFindRefComparison.DynamicStringTypeType representing a dynamically created String.static classFindRefComparison.EmptyStringTypestatic classFindRefComparison.FinalConstantstatic classFindRefComparison.ParameterStringTypeType representing a String passed as a parameter.private static classFindRefComparison.RefComparisonTypeFrameModelingVisitorprivate static classFindRefComparison.RefComparisonTypeMergerType merger to use the extended String types.private static classFindRefComparison.SpecialTypeAnalysisstatic classFindRefComparison.StaticStringTypeType representing a static String.private static interfaceFindRefComparison.WarningDecoratorprivate static classFindRefComparison.WarningWithPropertiesA BugInstance and its WarningPropertySet.
-
Field Summary
Fields Modifier and Type Field Description private static intBASE_ES_PRIORITYprivate BugAccumulatorbugAccumulatorprivate BugReporterbugReporterprivate ClassContextclassContextprivate java.util.Map<java.lang.String,java.lang.Integer>comparedForEqualityInThisMethodprivate static booleanDEBUGprivate static java.util.Set<java.lang.String>DEFAULT_SUSPICIOUS_SETClasses that are suspicious if compared by reference.private static org.apache.bcel.generic.TypedynamicStringTypeInstanceprivate static org.apache.bcel.generic.TypeemptyStringTypeInstanceprivate static java.util.BitSetinvokeInstanceSetSet of opcodes that invoke instance methods on an object.private static org.apache.bcel.generic.TypeparameterStringTypeInstanceprivate static java.util.BitSetprescreenSetSet of bytecodes using for prescreening.private static org.apache.bcel.generic.TypestaticStringTypeInstanceprivate static java.lang.StringSTRING_SIGNATUREprivate java.util.Set<java.lang.String>suspiciousSetprivate static byteT_DYNAMIC_STRINGprivate static byteT_PARAMETER_STRINGprivate static byteT_STATIC_STRINGprivate booleantestingEnabled-
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 Constructor Description FindRefComparison(BugReporter bugReporter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) voidaddEqualsCheck(java.lang.String type, int pc)private voidanalyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method)private voidcheckEqualsComparison(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 booleancheckForWeirdEquals(java.lang.String lhsSig, java.lang.String rhsSig, java.util.Set<XMethod> targets)private voidcheckRefComparison(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, java.util.List<FindRefComparison.WarningWithProperties> stringComparisonList, java.util.List<FindRefComparison.WarningWithProperties> refComparisonList)private static booleancomparingClasses(org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType)private static booleancomparingEnumsSameType(org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType)private voiddecorateWarnings(java.util.LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.WarningDecorator warningDecorator)MethodDescriptorgetInvokedMethod(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv)MethodAnnotationgetMethodCalledAnnotation(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv)private voidhandleStringComparison(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, java.util.List<FindRefComparison.WarningWithProperties> stringComparisonList, Location location, org.apache.bcel.generic.Type lhsType, org.apache.bcel.generic.Type rhsType)private voidhandleSuspiciousRefComparison(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, java.util.List<FindRefComparison.WarningWithProperties> refComparisonList, Location location, java.lang.String lhs, org.apache.bcel.generic.ReferenceType lhsType, org.apache.bcel.generic.ReferenceType rhsType, java.util.Optional<java.lang.Integer> priorityOverride)private voidinspectLocation(org.apache.bcel.classfile.JavaClass jclass, org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.classfile.Method method, org.apache.bcel.generic.MethodGen methodGen, java.util.LinkedList<FindRefComparison.WarningWithProperties> refComparisonList, java.util.LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, TypeDataflow typeDataflow, Location location)private static booleanisClassType(org.apache.bcel.generic.Type type)private static booleanisComparisonInsideEqualsMethod(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 booleanisLombokWithMethod(org.apache.bcel.classfile.Method method)Lombok's "with" methods include an == comparison reported as RC_REF_COMPARISON.(package private) booleanmightBeLaterCheckedUsingEquals(FindRefComparison.WarningWithProperties warning)voidreport()This method is called after all classes to be visited.private booleanreportAllRefComparisons()private voidreportBest(ClassContext classContext, org.apache.bcel.classfile.Method method, java.util.LinkedList<FindRefComparison.WarningWithProperties> warningList, boolean relaxed)private static org.apache.bcel.classfile.JavaClassresolveJavaClass(org.apache.bcel.generic.Type type)voidvisitClassContext(ClassContext classContext)Visit the ClassContext for a class which should be analyzed for instances of bug patterns.
-
-
-
Field Detail
-
DEBUG
private static final boolean DEBUG
-
BASE_ES_PRIORITY
private static final int BASE_ES_PRIORITY
-
DEFAULT_SUSPICIOUS_SET
@StaticConstant private static final java.util.Set<java.lang.String> DEFAULT_SUSPICIOUS_SET
Classes that are suspicious if compared by reference.
-
invokeInstanceSet
private static final java.util.BitSet invokeInstanceSet
Set of opcodes that invoke instance methods on an object.
-
prescreenSet
private static final java.util.BitSet prescreenSet
Set of bytecodes using for prescreening.
-
T_DYNAMIC_STRING
private static final byte T_DYNAMIC_STRING
- See Also:
- Constant Field Values
-
T_STATIC_STRING
private static final byte T_STATIC_STRING
- See Also:
- Constant Field Values
-
T_PARAMETER_STRING
private static final byte T_PARAMETER_STRING
- See Also:
- Constant Field Values
-
STRING_SIGNATURE
private static final java.lang.String STRING_SIGNATURE
- See Also:
- Constant Field Values
-
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
private final BugReporter bugReporter
-
bugAccumulator
private final BugAccumulator bugAccumulator
-
classContext
private ClassContext classContext
-
suspiciousSet
private final java.util.Set<java.lang.String> suspiciousSet
-
testingEnabled
private final boolean testingEnabled
-
comparedForEqualityInThisMethod
private java.util.Map<java.lang.String,java.lang.Integer> comparedForEqualityInThisMethod
-
-
Constructor Detail
-
FindRefComparison
public FindRefComparison(BugReporter bugReporter)
-
-
Method Detail
-
reportAllRefComparisons
private boolean reportAllRefComparisons()
-
visitClassContext
public void visitClassContext(ClassContext classContext)
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
-
isLombokWithMethod
private boolean isLombokWithMethod(org.apache.bcel.classfile.Method method)
Lombok's "with" methods include an == comparison reported as RC_REF_COMPARISON.- Returns:
trueif the method is generated with Lombok's@Withannotation
-
analyzeMethod
private void analyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method) throws CFGBuilderException, DataflowAnalysisException
-
mightBeLaterCheckedUsingEquals
boolean mightBeLaterCheckedUsingEquals(FindRefComparison.WarningWithProperties warning)
-
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, java.util.LinkedList<FindRefComparison.WarningWithProperties> refComparisonList, java.util.LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.RefComparisonTypeFrameModelingVisitor visitor, TypeDataflow typeDataflow, Location location) throws DataflowAnalysisException- Throws:
DataflowAnalysisException
-
decorateWarnings
private void decorateWarnings(java.util.LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.WarningDecorator warningDecorator)
-
reportBest
private void reportBest(ClassContext classContext, org.apache.bcel.classfile.Method method, java.util.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, java.util.List<FindRefComparison.WarningWithProperties> stringComparisonList, java.util.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, java.util.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, java.util.List<FindRefComparison.WarningWithProperties> refComparisonList, Location location, java.lang.String lhs, org.apache.bcel.generic.ReferenceType lhsType, org.apache.bcel.generic.ReferenceType rhsType, java.util.Optional<java.lang.Integer> priorityOverride)
-
addEqualsCheck
void addEqualsCheck(java.lang.String type, int pc)
-
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
private boolean checkForWeirdEquals(java.lang.String lhsSig, java.lang.String rhsSig, java.util.Set<XMethod> targets)
-
-