Class FieldCouldBeLocal

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.FieldCouldBeLocal
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

public class FieldCouldBeLocal extends edu.umd.cs.findbugs.BytecodeScanningDetector
finds fields that are used in a locals only fashion, specifically private fields that are accessed first in each method with a store vs. a load.
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    private static class 
    holds the parse state of the current basic block, and what fields are left to be checked the fields that are left to be checked are a reference from the parent block and a new collection is created on first write to the set to reduce memory concerns.
    private static class 
    holds information about a field and it's first usage
    private static class 
    a visitor that determines what methods write to what fields
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final edu.umd.cs.findbugs.BugReporter
     
    private edu.umd.cs.findbugs.ba.CFG
     
    private edu.umd.cs.findbugs.ba.ClassContext
     
    private String
     
    private String
     
    private org.apache.bcel.generic.ConstantPoolGen
     
     
    private Map<String,Set<String>>
     
    private BitSet
     

    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
    FieldCouldBeLocal(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a FCBL detector given the reporter to report bugs on.
  • Method Summary

    Modifier and Type
    Method
    Description
    private void
    buildMethodFieldModifiers(edu.umd.cs.findbugs.ba.ClassContext classContext)
    builds up the method to field map of what method write to which fields this is one recursively so that if method A calls method B, and method B writes to field C, then A modifies F.
    private void
    checkBlock(edu.umd.cs.findbugs.ba.BasicBlock startBB, Set<String> uncheckedFields)
    looks in this basic block for the first access to the fields in uncheckedFields.
    private static String
    getFieldDefiningClassNameFromInstruction(org.apache.bcel.generic.FieldInstruction fins, org.apache.bcel.classfile.ConstantPool cp)
     
    private static String
    getFieldNameFromInstruction(org.apache.bcel.generic.FieldInstruction fins, org.apache.bcel.classfile.ConstantPool cp)
     
    private boolean
    prescreen(org.apache.bcel.classfile.Method method)
    looks for methods that contain a GETFIELD or PUTFIELD opcodes
    private void
    processNestMateMethodCode(String visitedClass, org.apache.bcel.classfile.Code methodCode, org.apache.bcel.classfile.ConstantPool cp)
     
    private void
    removeFieldsReferencedInNestMates(org.apache.bcel.classfile.JavaClass cls, edu.umd.cs.findbugs.ba.ClassContext classContext)
     
    void
    sawOpcode(int seen)
    implements the visitor to add SourceLineAnnotations for fields in constructors and static initializers.
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    overrides the visitor to collect localizable fields, and then report those that survive all method checks.
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor to pass through constructors and static initializers to the byte code scanning code.
    void
    visitMethod(org.apache.bcel.classfile.Method obj)
    overrides the visitor to navigate basic blocks looking for all first usages of fields, removing those that are read from first.

    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, 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

    • bugReporter

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

      private edu.umd.cs.findbugs.ba.ClassContext clsContext
    • localizableFields

      private Map<String,FieldCouldBeLocal.FieldInfo> localizableFields
    • cfg

      private edu.umd.cs.findbugs.ba.CFG cfg
    • cpg

      private org.apache.bcel.generic.ConstantPoolGen cpg
    • visitedBlocks

      private BitSet visitedBlocks
    • methodFieldModifiers

      private Map<String,Set<String>> methodFieldModifiers
    • clsName

      private String clsName
    • clsSig

      private String clsSig
  • Constructor Details

    • FieldCouldBeLocal

      public FieldCouldBeLocal(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a FCBL 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 collect localizable fields, and then report those that survive all method checks.
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the context object that holds the JavaClass parsed
    • removeFieldsReferencedInNestMates

      private void removeFieldsReferencedInNestMates(org.apache.bcel.classfile.JavaClass cls, edu.umd.cs.findbugs.ba.ClassContext classContext)
    • processNestMateMethodCode

      private void processNestMateMethodCode(String visitedClass, org.apache.bcel.classfile.Code methodCode, org.apache.bcel.classfile.ConstantPool cp)
    • getFieldNameFromInstruction

      private static String getFieldNameFromInstruction(org.apache.bcel.generic.FieldInstruction fins, org.apache.bcel.classfile.ConstantPool cp)
    • getFieldDefiningClassNameFromInstruction

      private static String getFieldDefiningClassNameFromInstruction(org.apache.bcel.generic.FieldInstruction fins, org.apache.bcel.classfile.ConstantPool cp)
    • visitMethod

      public void visitMethod(org.apache.bcel.classfile.Method obj)
      overrides the visitor to navigate basic blocks looking for all first usages of fields, removing those that are read from first.
      Specified by:
      visitMethod in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitMethod in class edu.umd.cs.findbugs.visitclass.BetterVisitor
      Parameters:
      obj - the context object of the currently parsed method
    • prescreen

      private boolean prescreen(org.apache.bcel.classfile.Method method)
      looks for methods that contain a GETFIELD or PUTFIELD opcodes
      Parameters:
      method - the context object of the current method
      Returns:
      if the class uses GETFIELD or PUTFIELD
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      implements the visitor to pass through constructors and static initializers to the byte code scanning code. These methods are not reported, but are used to build SourceLineAnnotations for fields, if accessed.
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
      Parameters:
      obj - the context object of the currently parsed code attribute
    • sawOpcode

      public void sawOpcode(int seen)
      implements the visitor to add SourceLineAnnotations for fields in constructors and static initializers.
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode of the currently visited instruction
    • checkBlock

      private void checkBlock(edu.umd.cs.findbugs.ba.BasicBlock startBB, Set<String> uncheckedFields)
      looks in this basic block for the first access to the fields in uncheckedFields. Once found the item is removed from uncheckedFields, and removed from localizableFields if the access is a GETFIELD. If any unchecked fields remain, this method is recursively called on all outgoing edges of this basic block.
      Parameters:
      startBB - this basic block
      uncheckedFields - the list of fields to look for
    • buildMethodFieldModifiers

      private void buildMethodFieldModifiers(edu.umd.cs.findbugs.ba.ClassContext classContext)
      builds up the method to field map of what method write to which fields this is one recursively so that if method A calls method B, and method B writes to field C, then A modifies F.
      Parameters:
      classContext - the context object of the currently parsed class