Class NeedlessMemberCollectionSynchronization

java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.NeedlessMemberCollectionSynchronization
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

@CustomUserValue public class NeedlessMemberCollectionSynchronization extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for private collection members, either static or instance, that are only initialized in the clinit or init, but are synchronized. This is not necessary as the constructor or static initializer are guaranteed to be thread safe.
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    (package private) static class 
    holds information about a field, namely the annotation and whether the collection is synchronized.
    private static enum 
     
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private Map<Integer,String>
     
    private edu.umd.cs.findbugs.BugReporter
     
    private String
     
    private static org.apache.bcel.classfile.JavaClass
     
     
    private static org.apache.bcel.classfile.JavaClass
     
    private static Set<String>
     
    private edu.umd.cs.findbugs.OpcodeStack
     
     
    private static Set<String>
     

    Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT

    Fields inherited from interface edu.umd.cs.findbugs.Priorities

    EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
  • Constructor Summary

    Constructors
    Constructor
    Description
    NeedlessMemberCollectionSynchronization(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a NMCS detector given the reporter to report bugs on
  • Method Summary

    Modifier and Type
    Method
    Description
    private boolean
    returns whether this instruction is creating a synchronized collection
    private void
    sets the source line annotation of a store to a collection if that collection is synchronized.
    private void
    removes collection fields that are passed to other methods as arguments
    private void
    sawCLInitOpcode(int seen)
    handle <clinit> blocks by looking for putstatic calls referencing synchronized collections
    private void
    sawInitOpcode(int seen)
    handle <init> blocks by looking for putfield calls referencing synchronized collections
    private void
    sawMethodOpcode(int seen)
    handles regular methods by looking for methods on collections that are modifying and removes those collections from the ones under review
    void
    sawOpcode(int seen)
    implements the visitor to call the approriate visitor based on state
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    implements the visitor to clear the collectionFields and stack and to report collections that remain unmodified out of clinit or init
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor to set the state based on the type of method being parsed
    void
    visitField(org.apache.bcel.classfile.Field obj)
    implements the visitor to find collection fields

    Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

    getClassContext, report, shouldVisitCode

    Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    afterOpcode, areOppositeBranches, atCatchBlock, beforeOpcode, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefConstantOperand, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, printOpCode, sawBranchTo, sawClass, sawDouble, sawField, sawFloat, sawIMethod, sawInt, sawLong, sawMethod, sawRegister, sawString, visit

    Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor

    getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation

    Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor

    amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntry

    Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor

    clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitMethod, visitSignature, visitSourceFile, visitSynthetic, visitUnknown

    Methods inherited from class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.apache.bcel.classfile.Visitor

    visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
  • Field Details

  • Constructor Details

    • NeedlessMemberCollectionSynchronization

      public NeedlessMemberCollectionSynchronization(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a NMCS detector given the reporter to report bugs on
      Parameters:
      bugReporter - the sync of bug reports
  • Method Details

    • visitClassContext

      public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
      implements the visitor to clear the collectionFields and stack and to report collections that remain unmodified out of clinit or init
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the context object of the currently parsed class
    • visitField

      public void visitField(org.apache.bcel.classfile.Field obj)
      implements the visitor to find collection fields
      Specified by:
      visitField in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitField in class edu.umd.cs.findbugs.visitclass.BetterVisitor
      Parameters:
      obj - the context object of the currently parse field
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      implements the visitor to set the state based on the type of method being parsed
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
      Parameters:
      obj - the context object of the currently parsed code block
    • sawOpcode

      public void sawOpcode(int seen)
      implements the visitor to call the approriate visitor based on state
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode of the currently parsed instruction
    • sawCLInitOpcode

      private void sawCLInitOpcode(int seen)
      handle <clinit> blocks by looking for putstatic calls referencing synchronized collections
      Parameters:
      seen - the opcode of the currently parsed instruction
    • sawInitOpcode

      private void sawInitOpcode(int seen)
      handle <init> blocks by looking for putfield calls referencing synchronized collections
      Parameters:
      seen - the opcode of the currently parsed instruction
    • sawMethodOpcode

      private void sawMethodOpcode(int seen)
      handles regular methods by looking for methods on collections that are modifying and removes those collections from the ones under review
      Parameters:
      seen - the opcode of the currently parsed instruction
    • isSyncCollectionCreation

      private boolean isSyncCollectionCreation(int seen)
      returns whether this instruction is creating a synchronized collection
      Parameters:
      seen - the opcode of the currently parsed instruction
      Returns:
      whether a synchronized collection has just been created
    • processCollectionStore

      private void processCollectionStore()
      sets the source line annotation of a store to a collection if that collection is synchronized.
    • removeCollectionParameters

      private void removeCollectionParameters()
      removes collection fields that are passed to other methods as arguments