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 Classes
    Modifier and Type
    Class
    Description
    private static class 
    represents a field that is a executor
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final edu.umd.cs.findbugs.BugReporter
     
    private Map<edu.umd.cs.findbugs.ba.XField,Integer>
     
    private static final Set<String>
     
    private Map<edu.umd.cs.findbugs.ba.XField,HangingExecutors.AnnotationPriority>
     
    private boolean
     
    private final LocalHangingExecutor
     
    private String
     
    private static final Set<String>
     
    private edu.umd.cs.findbugs.OpcodeStack
     

    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
    HangingExecutors(edu.umd.cs.findbugs.BugReporter reporter)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    private void
    addExemptionIfShutdownCalled(edu.umd.cs.findbugs.ba.XField fieldOnWhichMethodIsInvoked)
     
    private boolean
    checkException(edu.umd.cs.findbugs.ba.XField f)
     
    private void
     
    private void
    parseFieldsForHangingCandidates(edu.umd.cs.findbugs.ba.ClassContext classContext)
     
    private void
     
    private void
    removeCandidateIfShutdownCalled(edu.umd.cs.findbugs.ba.XField fieldOnWhichMethodIsInvoked)
     
    private void
     
    private void
     
    private void
    reportOverwrittenField(edu.umd.cs.findbugs.ba.XField f)
     
    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.
    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)
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor to reset the opcode stack
    void
    visitMethod(org.apache.bcel.classfile.Method obj)
    implements the visitor to collect the method name

    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, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, 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

    • hangableSig

      private static final Set<String> hangableSig
    • shutdownMethods

      private static final Set<String> shutdownMethods
    • bugReporter

      private final edu.umd.cs.findbugs.BugReporter bugReporter
    • hangingFieldCandidates

      private Map<edu.umd.cs.findbugs.ba.XField,HangingExecutors.AnnotationPriority> hangingFieldCandidates
    • exemptExecutors

      private Map<edu.umd.cs.findbugs.ba.XField,Integer> exemptExecutors
    • stack

      private edu.umd.cs.findbugs.OpcodeStack stack
    • methodName

      private String methodName
    • isInitializer

      private boolean isInitializer
    • localHEDetector

      private final LocalHangingExecutor 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:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.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:
      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
    • visitMethod

      public void visitMethod(org.apache.bcel.classfile.Method obj)
      implements the visitor to collect the method name
      Specified by:
      visitMethod in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitMethod in class edu.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:
      sawOpcode in class edu.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)