Package com.mebigfatguy.fbcontrib.detect
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 ClassesModifier and TypeClassDescription(package private) static classholds information about a field, namely the annotation and whether the collection is synchronized.private static enum -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate edu.umd.cs.findbugs.BugReporterprivate Stringprivate static org.apache.bcel.classfile.JavaClassprivate static org.apache.bcel.classfile.JavaClassprivate edu.umd.cs.findbugs.OpcodeStackFields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINTFields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY -
Constructor Summary
ConstructorsConstructorDescriptionNeedlessMemberCollectionSynchronization(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a NMCS detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptionprivate booleanisSyncCollectionCreation(int seen) returns whether this instruction is creating a synchronized collectionprivate voidsets the source line annotation of a store to a collection if that collection is synchronized.private voidremoves collection fields that are passed to other methods as argumentsprivate voidsawCLInitOpcode(int seen) handle<clinit>blocks by looking for putstatic calls referencing synchronized collectionsprivate voidsawInitOpcode(int seen) handle<init>blocks by looking for putfield calls referencing synchronized collectionsprivate voidsawMethodOpcode(int seen) handles regular methods by looking for methods on collections that are modifying and removes those collections from the ones under reviewvoidsawOpcode(int seen) implements the visitor to call the approriate visitor based on statevoidvisitClassContext(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 initvoidvisitCode(org.apache.bcel.classfile.Code obj) implements the visitor to set the state based on the type of method being parsedvoidvisitField(org.apache.bcel.classfile.Field obj) implements the visitor to find collection fieldsMethods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, report, shouldVisitCodeMethods 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, visitMethods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor
getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationMethods 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, visitStackMapEntryMethods 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, visitUnknownMethods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.apache.bcel.classfile.Visitor
visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
-
Field Details
-
collectionClass
private static org.apache.bcel.classfile.JavaClass collectionClass -
mapClass
private static org.apache.bcel.classfile.JavaClass mapClass -
syncCollections
-
modifyingMethods
-
bugReporter
private edu.umd.cs.findbugs.BugReporter bugReporter -
collectionFields
-
aliases
-
stack
private edu.umd.cs.findbugs.OpcodeStack stack -
state
-
className
-
-
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:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.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:
visitFieldin interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitFieldin classedu.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:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.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:
sawOpcodein classedu.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
-