Package com.mebigfatguy.fbcontrib.detect
Class HangingExecutors
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.HangingExecutors
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
public class HangingExecutors
extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for executors that are never shutdown, which will not allow the
application to terminate
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static classrepresents a field that is a executor -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final edu.umd.cs.findbugs.BugReporterprivate Map<edu.umd.cs.findbugs.ba.XField, HangingExecutors.AnnotationPriority> private booleanprivate final LocalHangingExecutorprivate Stringprivate 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
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate voidaddExemptionIfShutdownCalled(edu.umd.cs.findbugs.ba.XField fieldOnWhichMethodIsInvoked) private booleancheckException(edu.umd.cs.findbugs.ba.XField f) private voidprivate voidparseFieldsForHangingCandidates(edu.umd.cs.findbugs.ba.ClassContext classContext) private voidprivate voidremoveCandidateIfShutdownCalled(edu.umd.cs.findbugs.ba.XField fieldOnWhichMethodIsInvoked) private voidprivate voidprivate voidreportOverwrittenField(edu.umd.cs.findbugs.ba.XField f) voidsawOpcode(int seen) Browses for calls to shutdown() and shutdownNow(), and if they happen, remove the hanging candidate, as there is a chance it will be called.voidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) finds ExecutorService objects that don't get a call to the terminating methods, and thus, never appear to be shutdown properly (the threads exist until shutdown is called)voidvisitCode(org.apache.bcel.classfile.Code obj) implements the visitor to reset the opcode stackvoidvisitMethod(org.apache.bcel.classfile.Method obj) implements the visitor to collect the method nameMethods 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, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, 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
-
hangableSig
-
shutdownMethods
-
bugReporter
private final edu.umd.cs.findbugs.BugReporter bugReporter -
hangingFieldCandidates
private Map<edu.umd.cs.findbugs.ba.XField,HangingExecutors.AnnotationPriority> hangingFieldCandidates -
exemptExecutors
-
stack
private edu.umd.cs.findbugs.OpcodeStack stack -
methodName
-
isInitializer
private boolean isInitializer -
localHEDetector
-
-
Constructor Details
-
HangingExecutors
public HangingExecutors(edu.umd.cs.findbugs.BugReporter reporter)
-
-
Method Details
-
visitClassContext
public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) finds ExecutorService objects that don't get a call to the terminating methods, and thus, never appear to be shutdown properly (the threads exist until shutdown is called)- Specified by:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.umd.cs.findbugs.BytecodeScanningDetector- Parameters:
classContext- the class context object of the currently parsed java class
-
parseFieldsForHangingCandidates
private void parseFieldsForHangingCandidates(edu.umd.cs.findbugs.ba.ClassContext classContext) -
reportHangingExecutorFieldBugs
private void reportHangingExecutorFieldBugs() -
visitCode
public void visitCode(org.apache.bcel.classfile.Code obj) implements the visitor to reset the opcode stack- 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
-
visitMethod
public void visitMethod(org.apache.bcel.classfile.Method obj) implements the visitor to collect the method name- Specified by:
visitMethodin interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitMethodin classedu.umd.cs.findbugs.visitclass.BetterVisitor- Parameters:
obj- the context object of the currently parsed method
-
sawOpcode
public void sawOpcode(int seen) Browses for calls to shutdown() and shutdownNow(), and if they happen, remove the hanging candidate, as there is a chance it will be called.- Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the opcode of the currently parsed instruction
-
processInvoke
private void processInvoke() -
lookForCustomThreadFactoriesInConstructors
private void lookForCustomThreadFactoriesInConstructors(int seen) -
reportOverwrittenField
private void reportOverwrittenField(edu.umd.cs.findbugs.ba.XField f) -
checkException
private boolean checkException(edu.umd.cs.findbugs.ba.XField f) -
removeFieldsThatGetReturned
private void removeFieldsThatGetReturned() -
addExemptionIfShutdownCalled
private void addExemptionIfShutdownCalled(edu.umd.cs.findbugs.ba.XField fieldOnWhichMethodIsInvoked) -
removeCandidateIfShutdownCalled
private void removeCandidateIfShutdownCalled(edu.umd.cs.findbugs.ba.XField fieldOnWhichMethodIsInvoked)
-