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

    Fields
    Modifier and Type
    Field
    Description
    private final edu.umd.cs.findbugs.BugReporter
     
    private static final Set<String>
     
    private Map<Integer,Set<String>>
     
    private Map<Integer,BitSet>
     
    private Map<Integer,Set<edu.umd.cs.findbugs.SourceLineAnnotation>>
     
    private Map<FQField,Set<String>>
     
    private Map<String,Set<edu.umd.cs.findbugs.SourceLineAnnotation>>
     
    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
    UnrelatedCollectionContents(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a UCC detector given the reporter to report bugs on
  • Method Summary

    Modifier and Type
    Method
    Description
    private static void
    addNewItem(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 item
    private void
    checkAdd(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 void
    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 void
    mergeItem(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.
    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
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    implements the visitor to create and destroy the stack and member collections
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor to reset the opcode stack, and clear the various collections

    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

    • COLLECTION_CLASSES

      private static final Set<String> COLLECTION_CLASSES
    • bugReporter

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

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

      private Map<FQField,Set<String>> memberCollections
    • localCollections

      private Map<Integer,Set<String>> localCollections
    • localScopeEnds

      private Map<Integer,BitSet> localScopeEnds
    • memberSourceLineAnnotations

      private Map<String,Set<edu.umd.cs.findbugs.SourceLineAnnotation>> memberSourceLineAnnotations
    • localSourceLineAnnotations

      private Map<Integer,Set<edu.umd.cs.findbugs.SourceLineAnnotation>> 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:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.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:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.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:
      sawOpcode in class edu.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 to
      addItm - 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 far
      sla - the location of this add
      addItm - 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 items
      addItm - the item we are adding
      Throws:
      ClassNotFoundException - if a superclass/interface is not found
    • intersection

      private static void intersection(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.
      Parameters:
      orig - the existing set of superclasses used for this collection
      add - the currently added item