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 class
FindRefComparison.DynamicStringType
Type representing a dynamically created String.static class
FindRefComparison.EmptyStringType
static class
FindRefComparison.FinalConstant
static class
FindRefComparison.ParameterStringType
Type representing a String passed as a parameter.private static class
FindRefComparison.RefComparisonTypeFrameModelingVisitor
private static class
FindRefComparison.RefComparisonTypeMerger
Type merger to use the extended String types.private static class
FindRefComparison.SpecialTypeAnalysis
static class
FindRefComparison.StaticStringType
Type representing a static String.private static interface
FindRefComparison.WarningDecorator
private static class
FindRefComparison.WarningWithProperties
A BugInstance and its WarningPropertySet.
-
Field Summary
Fields Modifier and Type Field Description private static int
BASE_ES_PRIORITY
private BugAccumulator
bugAccumulator
private BugReporter
bugReporter
private ClassContext
classContext
private java.util.Map<java.lang.String,java.lang.Integer>
comparedForEqualityInThisMethod
private static boolean
DEBUG
private static java.util.HashSet<java.lang.String>
DEFAULT_SUSPICIOUS_SET
Classes that are suspicious if compared by reference.private static org.apache.bcel.generic.Type
dynamicStringTypeInstance
private static org.apache.bcel.generic.Type
emptyStringTypeInstance
private static java.util.BitSet
invokeInstanceSet
Set of opcodes that invoke instance methods on an object.private static org.apache.bcel.generic.Type
parameterStringTypeInstance
private static java.util.BitSet
prescreenSet
Set of bytecodes using for prescreening.private static boolean
REPORT_ALL_REF_COMPARISONS
private static org.apache.bcel.generic.Type
staticStringTypeInstance
private static java.lang.String
STRING_SIGNATURE
private java.util.Set<java.lang.String>
suspiciousSet
private static byte
T_DYNAMIC_STRING
private static byte
T_PARAMETER_STRING
private static byte
T_STATIC_STRING
private boolean
testingEnabled
-
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 Instance Methods Concrete Methods Modifier and Type Method Description (package private) void
addEqualsCheck(java.lang.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(java.lang.String lhsSig, java.lang.String rhsSig, java.util.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, java.util.List<FindRefComparison.WarningWithProperties> stringComparisonList, java.util.List<FindRefComparison.WarningWithProperties> refComparisonList)
private void
decorateWarnings(java.util.LinkedList<FindRefComparison.WarningWithProperties> stringComparisonList, FindRefComparison.WarningDecorator warningDecorator)
MethodDescriptor
getInvokedMethod(org.apache.bcel.generic.ConstantPoolGen cpg, org.apache.bcel.generic.InvokeInstruction inv)
MethodAnnotation
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, java.util.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, java.util.List<FindRefComparison.WarningWithProperties> refComparisonList, Location location, java.lang.String lhs, org.apache.bcel.generic.ReferenceType lhsType, org.apache.bcel.generic.ReferenceType rhsType)
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)
(package private) boolean
mightBeLaterCheckedUsingEquals(FindRefComparison.WarningWithProperties warning)
void
report()
This method is called after all classes to be visited.private void
reportBest(ClassContext classContext, org.apache.bcel.classfile.Method method, java.util.LinkedList<FindRefComparison.WarningWithProperties> warningList, boolean relaxed)
void
visitClassContext(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
-
REPORT_ALL_REF_COMPARISONS
private static final boolean REPORT_ALL_REF_COMPARISONS
- See Also:
- Constant Field Values
-
BASE_ES_PRIORITY
private static final int BASE_ES_PRIORITY
-
DEFAULT_SUSPICIOUS_SET
@StaticConstant private static final java.util.HashSet<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
-
visitClassContext
public void visitClassContext(ClassContext classContext)
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
-
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)
-
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
-
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)
-
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)
-
-