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.HashSet<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 booleanREPORT_ALL_REF_COMPARISONSprivate 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 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 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)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)(package private) booleanmightBeLaterCheckedUsingEquals(FindRefComparison.WarningWithProperties warning)voidreport()This method is called after all classes to be visited.private voidreportBest(ClassContext classContext, org.apache.bcel.classfile.Method method, java.util.LinkedList<FindRefComparison.WarningWithProperties> warningList, boolean relaxed)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
-
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: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 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)
-
-