Package edu.umd.cs.findbugs.detect
Class SharedVariableAtomicityDetector
- 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
-
- edu.umd.cs.findbugs.bcel.OpcodeStackDetector
-
- edu.umd.cs.findbugs.detect.SharedVariableAtomicityDetector
-
- All Implemented Interfaces:
Detector,Priorities,org.apache.bcel.classfile.Visitor
public class SharedVariableAtomicityDetector extends OpcodeStackDetector
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classSharedVariableAtomicityDetector.PendingBugA candidate bug captured at the PUTFIELD/PUTSTATIC site, evaluated in report().-
Nested classes/interfaces inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo
-
-
Field Summary
Fields Modifier and Type Field Description private BugAccumulatorbugAccumulatorprivate CFGcurrentCFGprivate LockDataflowcurrentLockDataFlowprivate org.apache.bcel.classfile.MethodcurrentMethodprivate booleanhadOperationprivate booleanisFirstVisitprivate static java.util.Set<java.lang.Short>methodCallOpCodesprivate java.util.Map<XMethod,java.util.Set<XMethod>>nonSyncedMethodCallsByCallingMethodsprivate static java.util.Set<java.lang.Short>operationOpCodesprivate java.util.List<SharedVariableAtomicityDetector.PendingBug>pendingBugsprivate static java.util.Set<java.lang.Short>pushOpCodesprivate java.util.Map<XMethod,java.util.Set<XField>>readFieldsByMethodsprivate static java.util.Set<java.lang.Short>readOpCodesprivate java.util.Set<XField>relevantFields-
Fields inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
stack
-
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 SharedVariableAtomicityDetector(BugReporter reporter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidaddNonFinalFieldsOfClass(XField field, XMethod method, java.util.Map<XMethod,java.util.Set<XField>> map)private voidaddPendingBug(java.lang.String bugType, XMethod method, XField field)private voidcheckAndReportBug(int seen, XMethod method)private voidcollectFieldReadsAndInnerMethodCalls(int seen, XMethod method)private booleanhasNonSyncedNonPrivateCallToMethod(XMethod method, java.util.Set<XMethod> visitedMethods)private booleanis64bitPrimitive(java.lang.String className)private static booleanisEnclosingThisReference(XField field)private booleanisFieldOfMethodClassOrEnclosing(XField field, XMethod method)True iffieldis declared onmethod's own class or on one of its enclosing classes.private booleanisPrimitiveOrItsBoxingType(java.lang.String className)private booleanmapContainsFieldWithOtherMethod(XField field, XMethod method, java.util.Map<XMethod,java.util.Set<XField>> map)voidreport()This method is called after all classes to be visited.voidsawOpcode(int seen)By default, this method will not be called when stack is TOP.voidvisit(org.apache.bcel.classfile.JavaClass javaClass)voidvisit(org.apache.bcel.classfile.Method method)voidvisitAfter(org.apache.bcel.classfile.JavaClass obj)voidvisitClassContext(ClassContext classContext)Visit the ClassContext for a class which should be analyzed for instances of bug patterns.-
Methods inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
afterOpcode, beforeOpcode, getStack, isUsingCustomUserValue, visitCode
-
Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, shouldVisitCode
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
areOppositeBranches, atCatchBlock, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isIf, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, normalizeNullComparison, 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, 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, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, 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, visitPermittedSubclasses, visitRecord, visitRecordComponent, visitStackMapType
-
-
-
-
Field Detail
-
bugAccumulator
private final BugAccumulator bugAccumulator
-
currentMethod
private org.apache.bcel.classfile.Method currentMethod
-
currentCFG
private CFG currentCFG
-
currentLockDataFlow
private LockDataflow currentLockDataFlow
-
isFirstVisit
private boolean isFirstVisit
-
hadOperation
private boolean hadOperation
-
relevantFields
private final java.util.Set<XField> relevantFields
-
nonSyncedMethodCallsByCallingMethods
private final java.util.Map<XMethod,java.util.Set<XMethod>> nonSyncedMethodCallsByCallingMethods
-
pendingBugs
private final java.util.List<SharedVariableAtomicityDetector.PendingBug> pendingBugs
-
readOpCodes
private static final java.util.Set<java.lang.Short> readOpCodes
-
pushOpCodes
private static final java.util.Set<java.lang.Short> pushOpCodes
-
operationOpCodes
private static final java.util.Set<java.lang.Short> operationOpCodes
-
methodCallOpCodes
private static final java.util.Set<java.lang.Short> methodCallOpCodes
-
-
Constructor Detail
-
SharedVariableAtomicityDetector
public SharedVariableAtomicityDetector(BugReporter reporter)
-
-
Method Detail
-
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- Overrides:
visitClassContextin classBytecodeScanningDetector- Parameters:
classContext- the ClassContext
-
visit
public void visit(org.apache.bcel.classfile.JavaClass javaClass)
- Overrides:
visitin classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Method method)
- Overrides:
visitin classBetterVisitor
-
visitAfter
public void visitAfter(org.apache.bcel.classfile.JavaClass obj)
- Overrides:
visitAfterin classPreorderVisitor
-
sawOpcode
public void sawOpcode(int seen)
Description copied from class:OpcodeStackDetectorBy default, this method will not be called when stack is TOP. To change this behavior, override
#beforeOpcode(int)and change to return true even if stack is TOP.see Using FindBugs for Research to learn lattice and what TOP means.
- Specified by:
sawOpcodein classOpcodeStackDetector- See Also:
OpcodeStackDetector.beforeOpcode(int)
-
collectFieldReadsAndInnerMethodCalls
private void collectFieldReadsAndInnerMethodCalls(int seen, XMethod method)
-
addNonFinalFieldsOfClass
private void addNonFinalFieldsOfClass(XField field, XMethod method, java.util.Map<XMethod,java.util.Set<XField>> map)
-
hasNonSyncedNonPrivateCallToMethod
private boolean hasNonSyncedNonPrivateCallToMethod(XMethod method, java.util.Set<XMethod> visitedMethods)
-
mapContainsFieldWithOtherMethod
private boolean mapContainsFieldWithOtherMethod(XField field, XMethod method, java.util.Map<XMethod,java.util.Set<XField>> map)
-
checkAndReportBug
private void checkAndReportBug(int seen, XMethod method)
-
isPrimitiveOrItsBoxingType
private boolean isPrimitiveOrItsBoxingType(java.lang.String className)
-
is64bitPrimitive
private boolean is64bitPrimitive(java.lang.String className)
-
isFieldOfMethodClassOrEnclosing
private boolean isFieldOfMethodClassOrEnclosing(XField field, XMethod method)
True iffieldis declared onmethod's own class or on one of its enclosing classes. A non-static inner class can read and write fields of its enclosing instance via the syntheticthis$0reference, so the detector must follow that chain instead of only matching the inner class itself.
-
isEnclosingThisReference
private static boolean isEnclosingThisReference(XField field)
-
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.- Specified by:
reportin interfaceDetector- Overrides:
reportin classBytecodeScanningDetector
-
-