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 classFindInconsistentSync2.FieldAccessprivate static classFindInconsistentSync2.FieldStatsThe access statistics for a field.
-
Field Summary
Fields Modifier and Type Field Description private static booleanADJUST_SUBCLASS_ACCESSESprivate BugReporterbugReporterprivate static booleanDEBUGprivate static booleanEVALprivate static ClassDescriptorjavaxServletprivate static intLOCKEDprivate static intMIN_SYNC_PERCENTMinimum percent of unbiased field accesses that must be synchronized in order to report a field as inconsistently synchronized.private static intNULLCHECKprivate static intNULLCHECK_LOCKEDprivate static intNULLCHECK_UNLOCKEDprivate static intREADprivate static intREAD_LOCKEDprivate static intREAD_UNLOCKEDprivate static ClassDescriptorsingleThreadedServletprivate java.util.Map<XField,FindInconsistentSync2.FieldStats>statMapprivate static booleanSYNC_ACCESSprivate static intUNLOCKEDprivate static doubleUNSYNC_FACTORFactor which the biased number of unsynchronized accesses is multiplied by.private static intWRITEprivate static doubleWRITE_BIASBias that writes are given with respect to reads.private static intWRITE_LOCKEDprivate static intWRITE_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 voidanalyzeMethod(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.FieldStatsgetStats(XField field)Get the access statistics for given field.private static booleanisConstructor(java.lang.String methodName)static booleanisGetterMethod(ClassContext classContext, org.apache.bcel.classfile.Method method)Determine whether or not the given method is a getter method.static booleanisServletField(XField field)voidreport()This method is called after all classes to be visited.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
-
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) > nSyncthen 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_PERCENTalso 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
-
javaxServlet
private static ClassDescriptor javaxServlet
-
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:DetectorVisit the ClassContext for a class which should be analyzed for instances of bug patterns.- Specified by:
visitClassContextin interfaceDetector- Parameters:
classContext- the ClassContext
-
report
public void report()
Description copied from interface:DetectorThis 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.
-
-