Package com.mebigfatguy.fbcontrib.detect
Class OptionalIssues
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.OptionalIssues
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
@CustomUserValue
public class OptionalIssues
extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for various issues around use of java.util.Optional
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static classrepresents an opcode that was issued while there is still active elements on the stack.private static enum -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate Deque<OptionalIssues.ActiveStackOp> private Map<edu.umd.cs.findbugs.OpcodeStack.Item, edu.umd.cs.findbugs.SourceLineAnnotation> private edu.umd.cs.findbugs.BugReporterprivate org.apache.bcel.classfile.JavaClassprivate static final BitSetprivate Booleanjava.util.Optional is handled in the detector OptionalIssuesprivate static final FQMethodprivate static final FQMethodprivate static final FQMethodprivate static final Stringprivate edu.umd.cs.findbugs.OpcodeStackprivate org.apache.bcel.classfile.JavaClassFields 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
ConstructorsConstructorDescriptionOptionalIssues(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a OI detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptionprivate org.apache.bcel.classfile.MethodgetLambdaMethod(String methodName) finds the bootstrap method for a lambda (invokedynamic call.private booleanhasInvoke(byte[] byteCode) returns whether the byte code of a method has an invokeXXX statement in itprivate booleanprivate booleanreturns whether the set of operations that contributed to the current stack form, are trivial or not, specifically boxing a primitive value, or appending to strings or such.voidsawOpcode(int seen) implements the visitor to look for reference compares of Optional, Optional use when more specific Optionals should be used, and use of orElse when orElseGet would be more appropriatevoidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) implements the visitor to filter out pre-1.8 classes, for 1.8+ classes, it creates the opcode stack and active stack opsvoidvisitCode(org.apache.bcel.classfile.Code obj) implements the visitor clear the stacksMethods 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
-
OPTIONAL_SIGNATURE
- See Also:
-
BOXED_OPTIONAL_TYPES
-
OPTIONAL_OR_ELSE_METHOD
-
OPTIONAL_OR_ELSE_GET_METHOD
-
OPTIONAL_GET_METHOD
-
OR_ELSE_METHODS
-
OR_ELSE_GET_METHODS
-
OPTIONAL_CLASSES
java.util.Optional is handled in the detector OptionalIssues -
TRIVIAL_METHODS
-
INVOKE_OPS
-
SUPPLIER_CLASS
private org.apache.bcel.classfile.JavaClass SUPPLIER_CLASS -
bugReporter
private edu.umd.cs.findbugs.BugReporter bugReporter -
stack
private edu.umd.cs.findbugs.OpcodeStack stack -
currentClass
private org.apache.bcel.classfile.JavaClass currentClass -
activeStackOps
-
boxedItems
private Map<edu.umd.cs.findbugs.OpcodeStack.Item,edu.umd.cs.findbugs.SourceLineAnnotation> boxedItems -
methodIsConstrained
-
-
Constructor Details
-
OptionalIssues
public OptionalIssues(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a OI 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) implements the visitor to filter out pre-1.8 classes, for 1.8+ classes, it creates the opcode stack and active stack ops- 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) implements the visitor clear the stacks- 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) implements the visitor to look for reference compares of Optional, Optional use when more specific Optionals should be used, and use of orElse when orElseGet would be more appropriate- Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the opcode of the currently parsed instruction
-
isTrivialStackOps
private boolean isTrivialStackOps()returns whether the set of operations that contributed to the current stack form, are trivial or not, specifically boxing a primitive value, or appending to strings or such.- Returns:
- the operations that caused the current stack to exist are trivial
-
getLambdaMethod
finds the bootstrap method for a lambda (invokedynamic call. As findbugs doesn't support bcel 6, have to cheat a little here.- Parameters:
methodName- the lambda name- Returns:
- the method object if it exists
-
hasInvoke
private boolean hasInvoke(byte[] byteCode) returns whether the byte code of a method has an invokeXXX statement in it- Parameters:
byteCode- the byte code of a method to check- Returns:
- if there is an invokeXX method found
-
isMethodConstrained
private boolean isMethodConstrained()
-