Package com.mebigfatguy.fbcontrib.detect
Class DubiousListCollection
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.DubiousListCollection
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
public class DubiousListCollection
extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for fields that are implementations of java.util.List, but that are
used in a set-like fashion. Since lookup type operations are performed using
a linear search for Lists, the performance for large Lists will be poor.
Consideration should be made as to whether these fields should be sets. In
the case that order is important, consider using LinkedHashSet.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) classholds information about fields and keeps counts of set methods called on them -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final edu.umd.cs.findbugs.BugReporterprivate final Map<String, DubiousListCollection.FieldInfo> private final 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
ConstructorsConstructorDescriptionDubiousListCollection(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a DLC detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptionprivate edu.umd.cs.findbugs.FieldAnnotationgetFieldAnnotation(String fieldName) builds a field annotation by finding the field in the classes' field listprivate static edu.umd.cs.findbugs.ba.XFieldgetFieldFromStack(edu.umd.cs.findbugs.OpcodeStack stk, String signature) return the field object that the current method was called on, by finding the reference down in the stack based on the number of parametersprivate voidprivate voidprivate voidimplements the detector, by reporting all remaining fields that only have set based accessvoidsawOpcode(int seen) overrides the visitor to record all method calls on List fields.voidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) overrides the visitor to accept classes that define List based fieldsvoidvisitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to reset the opcode stack objectMethods 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
-
setMethods
-
listMethods
-
bugReporter
private final edu.umd.cs.findbugs.BugReporter bugReporter -
stack
private final edu.umd.cs.findbugs.OpcodeStack stack -
fieldsReported
-
-
Constructor Details
-
DubiousListCollection
public DubiousListCollection(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a DLC 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 accept classes that define List based fields- Specified by:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.umd.cs.findbugs.BytecodeScanningDetector- Parameters:
classContext- the context object for the currently parsed class
-
visitCode
public void visitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to reset the opcode stack object- Specified by:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.umd.cs.findbugs.visitclass.PreorderVisitor- Parameters:
obj- the code object for the currently parse method
-
sawOpcode
public void sawOpcode(int seen) overrides the visitor to record all method calls on List fields. If a method is not a set based method, remove it from further consideration- Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the current opcode parsed.
-
processInvokeInterface
private void processInvokeInterface() -
processInvokeVirtual
private void processInvokeVirtual() -
getFieldFromStack
@Nullable private static edu.umd.cs.findbugs.ba.XField getFieldFromStack(edu.umd.cs.findbugs.OpcodeStack stk, String signature) return the field object that the current method was called on, by finding the reference down in the stack based on the number of parameters- Parameters:
stk- the opcode stack where fields are storedsignature- the signature of the called method- Returns:
- the field annotation for the field whose method was executed
-
reportBugs
private void reportBugs()implements the detector, by reporting all remaining fields that only have set based access -
getFieldAnnotation
builds a field annotation by finding the field in the classes' field list- Parameters:
fieldName- the field for which to built the field annotation- Returns:
- the field annotation of the specified field
-