Package com.mebigfatguy.fbcontrib.detect
Class UnrelatedCollectionContents
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.UnrelatedCollectionContents
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
public class UnrelatedCollectionContents
extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for collections or arrays that hold objects that are unrelated thru
class or interface inheritance other than java.lang.Object. Doing so, makes
for brittle code, relying either on positional correspondence for type, or a
reliance on instanceof to determine type. A better design usually can be had
by creating a separate class, which defines the different types required, and
add an instance of that class to the collection, or array.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final edu.umd.cs.findbugs.BugReporterprivate 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
ConstructorsConstructorDescriptionUnrelatedCollectionContents(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a UCC detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptionprivate static voidaddNewItem(Set<String> supers, edu.umd.cs.findbugs.OpcodeStack.Item addItm) adds this item's type and all of it's superclass/interfaces to the set of possible types that could define this added itemprivate voidcheckAdd(edu.umd.cs.findbugs.OpcodeStack.Item colItm, edu.umd.cs.findbugs.OpcodeStack.Item addItm) processes an add into a collection, by processing all the super classes/interfaces of an object and removing the possible set of parent classes that have been seen so far, by doing what amounts to a intersection of what has been seen before, and this occurance.private static voidintersection(Set<String> orig, Set<String> add) performs a typical set intersection between what types of possible superclasses/interfaces has been seen before, for this collection, and what is now seen.private voidmergeItem(Set<String> supers, Set<edu.umd.cs.findbugs.SourceLineAnnotation> sla, edu.umd.cs.findbugs.OpcodeStack.Item addItm) intersects the set of possible superclass that this collection might have seen before with this one.voidsawOpcode(int seen) implements the visitor to look for collection method calls that put objects into the collection that are unrelated by anything besides java.lang.ObjecctvoidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) implements the visitor to create and destroy the stack and member collectionsvoidvisitCode(org.apache.bcel.classfile.Code obj) implements the visitor to reset the opcode stack, and clear the various collectionsMethods 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
-
COLLECTION_CLASSES
-
bugReporter
private final edu.umd.cs.findbugs.BugReporter bugReporter -
stack
private edu.umd.cs.findbugs.OpcodeStack stack -
memberCollections
-
localCollections
-
localScopeEnds
-
memberSourceLineAnnotations
-
localSourceLineAnnotations
-
-
Constructor Details
-
UnrelatedCollectionContents
public UnrelatedCollectionContents(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a UCC 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 create and destroy the stack and member collections- 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) implements the visitor to reset the opcode stack, and clear the various collections- Specified by:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.umd.cs.findbugs.visitclass.PreorderVisitor- Parameters:
obj- the currently parsed code block
-
sawOpcode
public void sawOpcode(int seen) implements the visitor to look for collection method calls that put objects into the collection that are unrelated by anything besides java.lang.Objecct- Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the currently parsed opcode
-
checkAdd
private void checkAdd(edu.umd.cs.findbugs.OpcodeStack.Item colItm, edu.umd.cs.findbugs.OpcodeStack.Item addItm) throws ClassNotFoundException processes an add into a collection, by processing all the super classes/interfaces of an object and removing the possible set of parent classes that have been seen so far, by doing what amounts to a intersection of what has been seen before, and this occurance.- Parameters:
colItm- the collection that is being added toaddItm- the added item- Throws:
ClassNotFoundException- if a super class is not found
-
mergeItem
private void mergeItem(Set<String> supers, Set<edu.umd.cs.findbugs.SourceLineAnnotation> sla, edu.umd.cs.findbugs.OpcodeStack.Item addItm) throws ClassNotFoundException intersects the set of possible superclass that this collection might have seen before with this one. If we find that there is no commonality between superclasses, report it as a bug.- Parameters:
supers- the collection of possible superclass/interfaces that has been seen for this collection thus farsla- the location of this addaddItm- the currently added item- Throws:
ClassNotFoundException- if a superclass/interface can not be found
-
addNewItem
private static void addNewItem(Set<String> supers, edu.umd.cs.findbugs.OpcodeStack.Item addItm) throws ClassNotFoundException adds this item's type and all of it's superclass/interfaces to the set of possible types that could define this added item- Parameters:
supers- the current set of superclass itemsaddItm- the item we are adding- Throws:
ClassNotFoundException- if a superclass/interface is not found
-
intersection
performs a typical set intersection between what types of possible superclasses/interfaces has been seen before, for this collection, and what is now seen.- Parameters:
orig- the existing set of superclasses used for this collectionadd- the currently added item
-