Package edu.umd.cs.findbugs.detect
Class FindInconsistentSync2
- java.lang.Object
-
- edu.umd.cs.findbugs.detect.FindInconsistentSync2
-
- All Implemented Interfaces:
Detector
,Priorities
public class FindInconsistentSync2 extends java.lang.Object implements Detector
Find instance fields which are sometimes accessed (read or written) with the receiver lock held and sometimes without. These are candidates to be data races.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
FindInconsistentSync2.FieldAccess
private static class
FindInconsistentSync2.FieldStats
The access statistics for a field.
-
Field Summary
Fields Modifier and Type Field Description private static boolean
ADJUST_SUBCLASS_ACCESSES
private BugReporter
bugReporter
private static boolean
DEBUG
private static boolean
EVAL
private static int
LOCKED
private static int
MIN_SYNC_PERCENT
Minimum percent of unbiased field accesses that must be synchronized in order to report a field as inconsistently synchronized.private static int
NULLCHECK
private static int
NULLCHECK_LOCKED
private static int
NULLCHECK_UNLOCKED
private static int
READ
private static int
READ_LOCKED
private static int
READ_UNLOCKED
private static ClassDescriptor
servlet
private static ClassDescriptor
singleThreadedServlet
private java.util.Map<XField,FindInconsistentSync2.FieldStats>
statMap
private static boolean
SYNC_ACCESS
private static int
UNLOCKED
private static double
UNSYNC_FACTOR
Factor which the biased number of unsynchronized accesses is multiplied by.private static int
WRITE
private static double
WRITE_BIAS
Bias that writes are given with respect to reads.private static int
WRITE_LOCKED
private static int
WRITE_UNLOCKED
-
Fields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
-
-
Constructor Summary
Constructors Constructor Description FindInconsistentSync2(BugReporter bugReporter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
analyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method, java.util.Set<org.apache.bcel.classfile.Method> lockedMethodSet)
private static java.util.Set<org.apache.bcel.classfile.Method>
findLockedMethods(ClassContext classContext, SelfCalls selfCalls, java.util.Set<CallSite> obviouslyLockedSites)
Find methods that appear to always be called from a locked context.private static java.util.Set<org.apache.bcel.classfile.Method>
findNotUnlockedMethods(ClassContext classContext, SelfCalls selfCalls, java.util.Set<CallSite> obviouslyLockedSites)
Find methods that appear to never be called from an unlocked context We assume that nonpublic methods will only be called from within the class, which is not really a valid assumption.private static java.util.Set<CallSite>
findObviouslyLockedCallSites(ClassContext classContext, SelfCalls selfCalls)
Find all self-call sites that are obviously locked.private FindInconsistentSync2.FieldStats
getStats(XField field)
Get the access statistics for given field.private static boolean
isConstructor(java.lang.String methodName)
static boolean
isGetterMethod(ClassContext classContext, org.apache.bcel.classfile.Method method)
Determine whether or not the given method is a getter method.static boolean
isServletField(XField field)
void
report()
This method is called after all classes to be visited.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
-
SYNC_ACCESS
private static final boolean SYNC_ACCESS
- See Also:
- Constant Field Values
-
ADJUST_SUBCLASS_ACCESSES
private static final boolean ADJUST_SUBCLASS_ACCESSES
-
EVAL
private static final boolean EVAL
-
MIN_SYNC_PERCENT
private static final int MIN_SYNC_PERCENT
Minimum percent of unbiased field accesses that must be synchronized in order to report a field as inconsistently synchronized. This is meant to distinguish incidental synchronization from intentional synchronization.
-
WRITE_BIAS
private static final double WRITE_BIAS
Bias that writes are given with respect to reads. The idea is that this should be above 1.0, because unsynchronized writes are more dangerous than unsynchronized reads.
-
UNSYNC_FACTOR
private static final double UNSYNC_FACTOR
Factor which the biased number of unsynchronized accesses is multiplied by. I.e., for factor f, if nUnsync is the biased number of unsynchronized accesses, and nSync is the biased number of synchronized accesses, andf(nUnsync) > nSync
then we report a bug. Default value is 2.0, which means that we report a bug if more than 1/3 of accesses are unsynchronized.Note that
MIN_SYNC_PERCENT
also influences whether we report a bug: it specifies the minimum unbiased percentage of synchronized accesses.
-
UNLOCKED
private static final int UNLOCKED
- See Also:
- Constant Field Values
-
LOCKED
private static final int LOCKED
- See Also:
- Constant Field Values
-
READ
private static final int READ
- See Also:
- Constant Field Values
-
WRITE
private static final int WRITE
- See Also:
- Constant Field Values
-
NULLCHECK
private static final int NULLCHECK
- See Also:
- Constant Field Values
-
READ_UNLOCKED
private static final int READ_UNLOCKED
- See Also:
- Constant Field Values
-
WRITE_UNLOCKED
private static final int WRITE_UNLOCKED
- See Also:
- Constant Field Values
-
NULLCHECK_UNLOCKED
private static final int NULLCHECK_UNLOCKED
- See Also:
- Constant Field Values
-
READ_LOCKED
private static final int READ_LOCKED
- See Also:
- Constant Field Values
-
WRITE_LOCKED
private static final int WRITE_LOCKED
- See Also:
- Constant Field Values
-
NULLCHECK_LOCKED
private static final int NULLCHECK_LOCKED
- See Also:
- Constant Field Values
-
servlet
private static ClassDescriptor servlet
-
singleThreadedServlet
private static ClassDescriptor singleThreadedServlet
-
bugReporter
private final BugReporter bugReporter
-
statMap
private final java.util.Map<XField,FindInconsistentSync2.FieldStats> statMap
-
-
Constructor Detail
-
FindInconsistentSync2
public FindInconsistentSync2(BugReporter bugReporter)
-
-
Method Detail
-
isServletField
public static boolean isServletField(XField field)
-
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
-
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.
-
isConstructor
private static boolean isConstructor(java.lang.String methodName)
-
analyzeMethod
private void analyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method, java.util.Set<org.apache.bcel.classfile.Method> lockedMethodSet) throws CFGBuilderException, DataflowAnalysisException
-
isGetterMethod
public static boolean isGetterMethod(ClassContext classContext, org.apache.bcel.classfile.Method method)
Determine whether or not the given method is a getter method. I.e., if it just returns the value of an instance field.- Parameters:
classContext
- the ClassContext for the class containing the methodmethod
- the method
-
getStats
private FindInconsistentSync2.FieldStats getStats(XField field)
Get the access statistics for given field.
-
findNotUnlockedMethods
private static java.util.Set<org.apache.bcel.classfile.Method> findNotUnlockedMethods(ClassContext classContext, SelfCalls selfCalls, java.util.Set<CallSite> obviouslyLockedSites)
Find methods that appear to never be called from an unlocked context We assume that nonpublic methods will only be called from within the class, which is not really a valid assumption.
-
findLockedMethods
private static java.util.Set<org.apache.bcel.classfile.Method> findLockedMethods(ClassContext classContext, SelfCalls selfCalls, java.util.Set<CallSite> obviouslyLockedSites)
Find methods that appear to always be called from a locked context. We assume that nonpublic methods will only be called from within the class, which is not really a valid assumption.
-
findObviouslyLockedCallSites
private static java.util.Set<CallSite> findObviouslyLockedCallSites(ClassContext classContext, SelfCalls selfCalls) throws CFGBuilderException, DataflowAnalysisException
Find all self-call sites that are obviously locked.
-
-