Class ExceptionSoftening

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.ExceptionSoftening
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

public class ExceptionSoftening extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for methods that catch checked exceptions, and throw unchecked exceptions in their place. There are several levels of concern. Least important are methods constrained by interface or super class contracts not to throw checked exceptions but appear owned by the same author. Next are methods constrained by interface or super class contracts and throw other types of checked exceptions. Lastly are method not constrained by any interface or superclass contract.
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    private static class 
    holds information about a catch block the start and end pcs, as well as the exception signature.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final edu.umd.cs.findbugs.BugReporter
     
    private int
     
    private Map<Integer,org.apache.bcel.classfile.CodeException>
     
     
    private Map<String,Set<String>>
     
    private boolean
     
    private boolean
     
    private org.apache.bcel.classfile.LocalVariableTable
     
    private org.apache.bcel.classfile.JavaClass
     
    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
    ExceptionSoftening(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a EXS detector given the reporter to report bugs on.
  • Method Summary

    Modifier and Type
    Method
    Description
    private Map<String,Set<String>>
    buildConstrainingInfo(org.apache.bcel.classfile.JavaClass cls, org.apache.bcel.classfile.Method m)
    returns exception names describing what exceptions are allowed to be thrown
    private static LinkedHashMap<Integer,org.apache.bcel.classfile.CodeException>
    collectExceptions(org.apache.bcel.classfile.CodeException... exceptions)
    collects all the valid exception objects (ones where start and finish are before the target) and with a catch type
    private static org.apache.bcel.classfile.Method
    findMethod(org.apache.bcel.classfile.JavaClass cls, String methodName, String methodSig)
    finds a method that matches the name and signature in the given class
    private static Set<String>
    returns an array of catch types that the current pc is in
    private Map<String,Set<String>>
    getConstrainingInfo(org.apache.bcel.classfile.JavaClass cls, org.apache.bcel.classfile.Method m)
    finds the super class or interface that constrains the types of exceptions that can be thrown from the given method
    private boolean
    prescreen(org.apache.bcel.classfile.Method method)
    returns whether a method explicitly throws an exception
    private void
     
    private void
     
    private static void
    remove catchinfo blocks from the map where the handler end is before the current pc
    void
    sawOpcode(int seen)
    overrides the visitor to find catch blocks that throw runtime exceptions
    private void
    reduces the end pc based on the optional LocalVariableTable's exception register scope
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    overrides the visitor to reset the stack
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    overrides the visitor to look for methods that catch checked exceptions and rethrow runtime exceptions

    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, 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

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

      private org.apache.bcel.classfile.JavaClass runtimeClass
    • stack

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

      private Map<Integer,org.apache.bcel.classfile.CodeException> catchHandlerPCs
    • catchInfos

      private List<ExceptionSoftening.CatchInfo> catchInfos
    • lvt

      private org.apache.bcel.classfile.LocalVariableTable lvt
    • constrainingInfo

      private Map<String,Set<String>> constrainingInfo
    • isBooleanMethod

      private boolean isBooleanMethod
    • hasValidFalseReturn

      private boolean hasValidFalseReturn
    • catchFalseReturnPC

      private int catchFalseReturnPC
  • Constructor Details

    • ExceptionSoftening

      public ExceptionSoftening(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a EXS 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)
      overrides the visitor to reset the stack
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the context object of the currently parsed class
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      overrides the visitor to look for methods that catch checked exceptions and rethrow runtime exceptions
      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
    • sawOpcode

      public void sawOpcode(int seen)
      overrides the visitor to find catch blocks that throw runtime exceptions
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode of the currently parsed instruction
    • processThrow

      private void processThrow()
    • processBooleanReturn

      private void processBooleanReturn()
    • collectExceptions

      private static LinkedHashMap<Integer,org.apache.bcel.classfile.CodeException> collectExceptions(org.apache.bcel.classfile.CodeException... exceptions)
      collects all the valid exception objects (ones where start and finish are before the target) and with a catch type
      Parameters:
      exceptions - the exceptions from the class file
      Returns:
      the filtered exceptions keyed by catch end pc
    • removeFinishedCatchBlocks

      private static void removeFinishedCatchBlocks(Iterable<ExceptionSoftening.CatchInfo> infos, int pc)
      remove catchinfo blocks from the map where the handler end is before the current pc
      Parameters:
      infos - the exception handlers installed
      pc - the current pc
    • updateEndPCsOnCatchRegScope

      private void updateEndPCsOnCatchRegScope(List<ExceptionSoftening.CatchInfo> infos, int pc, int seen)
      reduces the end pc based on the optional LocalVariableTable's exception register scope
      Parameters:
      infos - the list of active catch blocks
      pc - the current pc
      seen - the currently parsed opcode
    • findPossibleCatchSignatures

      private static Set<String> findPossibleCatchSignatures(List<ExceptionSoftening.CatchInfo> infos, int pc)
      returns an array of catch types that the current pc is in
      Parameters:
      infos - the list of catch infos for this method
      pc - the current pc
      Returns:
      an set of catch exception types that the pc is currently in
    • getConstrainingInfo

      @Nullable private Map<String,Set<String>> getConstrainingInfo(org.apache.bcel.classfile.JavaClass cls, org.apache.bcel.classfile.Method m) throws ClassNotFoundException
      finds the super class or interface that constrains the types of exceptions that can be thrown from the given method
      Parameters:
      cls - the currently parsed class
      m - the method to check
      Returns:
      a map containing the class name to a set of exceptions that constrain this method
      Throws:
      ClassNotFoundException - if a super class or super interface can't be loaded from the repository
    • findMethod

      @Nullable private static org.apache.bcel.classfile.Method findMethod(org.apache.bcel.classfile.JavaClass cls, String methodName, String methodSig)
      finds a method that matches the name and signature in the given class
      Parameters:
      cls - the class to look in
      methodName - the name to look for
      methodSig - the signature to look for
      Returns:
      the method or null
    • buildConstrainingInfo

      private Map<String,Set<String>> buildConstrainingInfo(org.apache.bcel.classfile.JavaClass cls, org.apache.bcel.classfile.Method m) throws ClassNotFoundException
      returns exception names describing what exceptions are allowed to be thrown
      Parameters:
      cls - the cls to find the exceptions in
      m - the method to add exceptions from
      Returns:
      a map with one entry of a class name to a set of exceptions that constrain what can be thrown.
      Throws:
      ClassNotFoundException - if an exception class can't be loaded from the repository
    • prescreen

      private boolean prescreen(org.apache.bcel.classfile.Method method)
      returns whether a method explicitly throws an exception
      Parameters:
      method - the currently parsed method
      Returns:
      if the method throws an exception