Package com.mebigfatguy.fbcontrib.detect
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 ClassesModifier and TypeClassDescriptionprivate static classholds 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 classholds information about a field and it's first usageprivate static classa visitor that determines what methods write to what fields -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final edu.umd.cs.findbugs.BugReporterprivate edu.umd.cs.findbugs.ba.CFGprivate edu.umd.cs.findbugs.ba.ClassContextprivate Stringprivate Stringprivate org.apache.bcel.generic.ConstantPoolGenprivate Map<String, FieldCouldBeLocal.FieldInfo> private BitSetFields 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
ConstructorsConstructorDescriptionFieldCouldBeLocal(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a FCBL detector given the reporter to report bugs on. -
Method Summary
Modifier and TypeMethodDescriptionprivate voidbuildMethodFieldModifiers(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 voidcheckBlock(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 StringgetFieldDefiningClassNameFromInstruction(org.apache.bcel.generic.FieldInstruction fins, org.apache.bcel.classfile.ConstantPool cp) private static StringgetFieldNameFromInstruction(org.apache.bcel.generic.FieldInstruction fins, org.apache.bcel.classfile.ConstantPool cp) private booleanprescreen(org.apache.bcel.classfile.Method method) looks for methods that contain a GETFIELD or PUTFIELD opcodesprivate voidprocessNestMateMethodCode(String visitedClass, org.apache.bcel.classfile.Code methodCode, org.apache.bcel.classfile.ConstantPool cp) private voidremoveFieldsReferencedInNestMates(org.apache.bcel.classfile.JavaClass cls, edu.umd.cs.findbugs.ba.ClassContext classContext) voidsawOpcode(int seen) implements the visitor to add SourceLineAnnotations for fields in constructors and static initializers.voidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext) overrides the visitor to collect localizable fields, and then report those that survive all method checks.voidvisitCode(org.apache.bcel.classfile.Code obj) implements the visitor to pass through constructors and static initializers to the byte code scanning code.voidvisitMethod(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, 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, 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
-
bugReporter
private final edu.umd.cs.findbugs.BugReporter bugReporter -
clsContext
private edu.umd.cs.findbugs.ba.ClassContext clsContext -
localizableFields
-
cfg
private edu.umd.cs.findbugs.ba.CFG cfg -
cpg
private org.apache.bcel.generic.ConstantPoolGen cpg -
visitedBlocks
-
methodFieldModifiers
-
clsName
-
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:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.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:
visitMethodin interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitMethodin classedu.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:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.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:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the opcode of the currently visited instruction
-
checkBlock
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 blockuncheckedFields- 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
-