Package com.mebigfatguy.fbcontrib.detect
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 ClassesModifier and TypeClassDescriptionprivate static classholds information about a catch block the start and end pcs, as well as the exception signature. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final edu.umd.cs.findbugs.BugReporterprivate intprivate List<ExceptionSoftening.CatchInfo> private booleanprivate booleanprivate org.apache.bcel.classfile.LocalVariableTableprivate org.apache.bcel.classfile.JavaClassprivate 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
ConstructorsConstructorDescriptionExceptionSoftening(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a EXS detector given the reporter to report bugs on. -
Method Summary
Modifier and TypeMethodDescriptionbuildConstrainingInfo(org.apache.bcel.classfile.JavaClass cls, org.apache.bcel.classfile.Method m) returns exception names describing what exceptions are allowed to be thrownprivate 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 typeprivate static org.apache.bcel.classfile.MethodfindMethod(org.apache.bcel.classfile.JavaClass cls, String methodName, String methodSig) finds a method that matches the name and signature in the given classfindPossibleCatchSignatures(List<ExceptionSoftening.CatchInfo> infos, int pc) returns an array of catch types that the current pc is ingetConstrainingInfo(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 methodprivate booleanprescreen(org.apache.bcel.classfile.Method method) returns whether a method explicitly throws an exceptionprivate voidprivate voidprivate static voidremoveFinishedCatchBlocks(Iterable<ExceptionSoftening.CatchInfo> infos, int pc) remove catchinfo blocks from the map where the handler end is before the current pcvoidsawOpcode(int seen) overrides the visitor to find catch blocks that throw runtime exceptionsprivate voidupdateEndPCsOnCatchRegScope(List<ExceptionSoftening.CatchInfo> infos, int pc, int seen) reduces the end pc based on the optional LocalVariableTable's exception register scopevoidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) overrides the visitor to reset the stackvoidvisitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to look for methods that catch checked exceptions and rethrow runtime exceptionsMethods 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, visitMethod, 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
-
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
-
catchInfos
-
lvt
private org.apache.bcel.classfile.LocalVariableTable lvt -
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:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.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:
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
-
sawOpcode
public void sawOpcode(int seen) overrides the visitor to find catch blocks that throw runtime exceptions- Overrides:
sawOpcodein classedu.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
remove catchinfo blocks from the map where the handler end is before the current pc- Parameters:
infos- the exception handlers installedpc- 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 blockspc- the current pcseen- 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 methodpc- 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 classm- 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 inmethodName- the name to look formethodSig- 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 inm- 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
-