Package edu.umd.cs.findbugs.detect
Class ResourceInMultipleThreadsDetector
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.ResourceInMultipleThreadsDetector
- All Implemented Interfaces:
Detector
,Priorities
,org.apache.bcel.classfile.Visitor
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final class
Nested classes/interfaces inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BugReporter
private final Map
<XField, ResourceInMultipleThreadsDetector.FieldData> private boolean
private boolean
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 -
Method Summary
Modifier and TypeMethodDescriptionprivate void
addToMethodsUsedInThreads
(XMethod methodToAdd) private void
collectFieldsUsedInThreads
(int seen) private void
collectMethodsUsedInThreads
(int seen) private void
createOrUpdateFieldData
(XField xField, boolean putfield, org.apache.bcel.classfile.Method containerMethod, XMethod xMethod) private Optional
<org.apache.bcel.classfile.Method> getMethodFromBootstrap
(org.apache.bcel.classfile.JavaClass javaClass, org.apache.bcel.classfile.ConstantInvokeDynamic constDyn) private boolean
isAtomicTypedField
(XField xField) private static boolean
A bug is reported if the field is modified in multiple methods, it is not only accessed in synchronized blocks, and it is not a synchronized collection or an atomic typed field.private boolean
Ignore a special case where a Thread is passed to thejava.lang.Runtime
class, so it is used as a shutdown hook.private void
void
sawOpcode
(int seen) By default, this method will not be called when stack is TOP.void
visit
(org.apache.bcel.classfile.JavaClass obj) void
visit
(org.apache.bcel.classfile.Method method) void
visitAfter
(org.apache.bcel.classfile.JavaClass javaClass) 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, report, shouldVisitCode, visitClassContext
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, 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, 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, visitRecord, visitRecordComponent, visitStackMapType
-
Field Details
-
bugReporter
-
synchronizedCollectionTypedFields
-
calledMethodsByMethods
-
methodsUsedInThreads
-
fieldsUsedInThreads
-
synchronizedBlock
private boolean synchronizedBlock -
firstPass
private boolean firstPass
-
-
Constructor Details
-
ResourceInMultipleThreadsDetector
-
-
Method Details
-
visit
public void visit(org.apache.bcel.classfile.JavaClass obj) - Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Method method) - Overrides:
visit
in classBetterVisitor
-
sawOpcode
public void sawOpcode(int seen) Description copied from class:OpcodeStackDetector
By 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:
sawOpcode
in classOpcodeStackDetector
- See Also:
-
collectMethodsUsedInThreads
private void collectMethodsUsedInThreads(int seen) -
addToMethodsUsedInThreads
-
isJavaRuntimeMethod
private boolean isJavaRuntimeMethod()Ignore a special case where a Thread is passed to thejava.lang.Runtime
class, so it is used as a shutdown hook.- Returns:
true
if the Thread is passed to thejava.lang.Runtime
class,false
otherwise
-
getMethodFromBootstrap
private Optional<org.apache.bcel.classfile.Method> getMethodFromBootstrap(org.apache.bcel.classfile.JavaClass javaClass, org.apache.bcel.classfile.ConstantInvokeDynamic constDyn) -
collectFieldsUsedInThreads
- Throws:
CheckedAnalysisException
-
isAtomicTypedField
-
createOrUpdateFieldData
-
visitAfter
public void visitAfter(org.apache.bcel.classfile.JavaClass javaClass) - Overrides:
visitAfter
in classPreorderVisitor
-
isBug
A bug is reported if the field is modified in multiple methods, it is not only accessed in synchronized blocks, and it is not a synchronized collection or an atomic typed field.- Parameters:
data
- the field data- Returns:
true
if the field is a bug,false
otherwise
-
resetState
private void resetState()
-