Class FindInconsistentSync2

java.lang.Object
edu.umd.cs.findbugs.detect.FindInconsistentSync2
All Implemented Interfaces:
Detector, Priorities

public class FindInconsistentSync2 extends 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.
  • Field Details

    • DEBUG

      private static final boolean DEBUG
    • SYNC_ACCESS

      private static final boolean SYNC_ACCESS
      See Also:
    • 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, and
            f(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:
    • LOCKED

      private static final int LOCKED
      See Also:
    • READ

      private static final int READ
      See Also:
    • WRITE

      private static final int WRITE
      See Also:
    • NULLCHECK

      private static final int NULLCHECK
      See Also:
    • READ_UNLOCKED

      private static final int READ_UNLOCKED
      See Also:
    • WRITE_UNLOCKED

      private static final int WRITE_UNLOCKED
      See Also:
    • NULLCHECK_UNLOCKED

      private static final int NULLCHECK_UNLOCKED
      See Also:
    • READ_LOCKED

      private static final int READ_LOCKED
      See Also:
    • WRITE_LOCKED

      private static final int WRITE_LOCKED
      See Also:
    • NULLCHECK_LOCKED

      private static final int NULLCHECK_LOCKED
      See Also:
    • servlet

      private static ClassDescriptor servlet
    • singleThreadedServlet

      private static ClassDescriptor singleThreadedServlet
    • bugReporter

      private final BugReporter bugReporter
    • statMap

  • Constructor Details

    • FindInconsistentSync2

      public FindInconsistentSync2(BugReporter bugReporter)
  • Method Details

    • 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 interface Detector
      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.
      Specified by:
      report in interface Detector
    • isConstructor

      private static boolean isConstructor(String methodName)
    • analyzeMethod

      private void analyzeMethod(ClassContext classContext, org.apache.bcel.classfile.Method method, Set<org.apache.bcel.classfile.Method> lockedMethodSet) throws CFGBuilderException, DataflowAnalysisException
      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 method
      method - the method
    • getStats

      private FindInconsistentSync2.FieldStats getStats(XField field)
      Get the access statistics for given field.
    • findNotUnlockedMethods

      private static Set<org.apache.bcel.classfile.Method> findNotUnlockedMethods(ClassContext classContext, SelfCalls selfCalls, 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 Set<org.apache.bcel.classfile.Method> findLockedMethods(ClassContext classContext, SelfCalls selfCalls, 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 Set<CallSite> findObviouslyLockedCallSites(ClassContext classContext, SelfCalls selfCalls) throws CFGBuilderException, DataflowAnalysisException
      Find all self-call sites that are obviously locked.
      Throws:
      CFGBuilderException
      DataflowAnalysisException