Package edu.umd.cs.findbugs.detect
Class MutableStaticFields
- java.lang.Object
-
- All Implemented Interfaces:
Detector
,Priorities
,org.apache.bcel.classfile.Visitor
public class MutableStaticFields extends BytecodeScanningDetector
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
MutableStaticFields.AllowedParameter
-
Field Summary
Fields Modifier and Type Field Description private BugReporter
bugReporter
private static java.util.Set<java.lang.String>
COLLECTION_SUPERCLASSES
(package private) boolean
emptyArrayOnTOS
(package private) java.util.Map<XField,SourceLineAnnotation>
firstFieldUse
(package private) boolean
inStaticInitializer
private boolean
isEclipseNLS
Eclipse uses reflection to initialize NLS message bundles.private static java.util.Set<java.lang.String>
MUTABLE_COLLECTION_CLASSES
private static java.util.Map<java.lang.String,java.util.Map<java.lang.String,MutableStaticFields.AllowedParameter>>
MUTABLE_COLLECTION_METHODS
(package private) java.util.Set<XField>
mutableCollection
(package private) boolean
mutableCollectionJustCreated
(package private) java.util.Set<XField>
needsRefactoringToBeFinal
(package private) java.util.Set<XField>
notFinal
(package private) java.util.Set<XField>
outsidePackage
(package private) java.lang.String
packageName
(package private) boolean
publicClass
(package private) java.util.Set<XField>
readAnywhere
(package private) java.util.LinkedList<XField>
seen
(package private) java.util.Set<XField>
unsafeValue
(package private) java.util.Set<XField>
writtenInMethod
(package private) java.util.Set<XField>
writtenTwiceInMethod
(package private) boolean
zeroOnTOS
-
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 MutableStaticFields(BugReporter bugReporter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) static java.lang.String
extractPackage(java.lang.String c)
private boolean
interesting(XField f)
private boolean
isCollection(java.lang.String signature)
void
report()
This method is called after all classes to be visited.void
sawOpcode(int seen)
void
visit(org.apache.bcel.classfile.Code obj)
void
visit(org.apache.bcel.classfile.Field obj)
void
visit(org.apache.bcel.classfile.JavaClass obj)
void
visit(org.apache.bcel.classfile.Method obj)
-
Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, shouldVisitCode, visitClassContext
-
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
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor
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, visitCode, 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, 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
-
-
-
-
Field Detail
-
COLLECTION_SUPERCLASSES
private static final java.util.Set<java.lang.String> COLLECTION_SUPERCLASSES
-
MUTABLE_COLLECTION_CLASSES
private static final java.util.Set<java.lang.String> MUTABLE_COLLECTION_CLASSES
-
MUTABLE_COLLECTION_METHODS
private static final java.util.Map<java.lang.String,java.util.Map<java.lang.String,MutableStaticFields.AllowedParameter>> MUTABLE_COLLECTION_METHODS
-
seen
java.util.LinkedList<XField> seen
-
publicClass
boolean publicClass
-
mutableCollectionJustCreated
boolean mutableCollectionJustCreated
-
zeroOnTOS
boolean zeroOnTOS
-
emptyArrayOnTOS
boolean emptyArrayOnTOS
-
inStaticInitializer
boolean inStaticInitializer
-
packageName
java.lang.String packageName
-
readAnywhere
java.util.Set<XField> readAnywhere
-
unsafeValue
java.util.Set<XField> unsafeValue
-
mutableCollection
java.util.Set<XField> mutableCollection
-
notFinal
java.util.Set<XField> notFinal
-
outsidePackage
java.util.Set<XField> outsidePackage
-
needsRefactoringToBeFinal
java.util.Set<XField> needsRefactoringToBeFinal
-
writtenInMethod
java.util.Set<XField> writtenInMethod
-
writtenTwiceInMethod
java.util.Set<XField> writtenTwiceInMethod
-
firstFieldUse
java.util.Map<XField,SourceLineAnnotation> firstFieldUse
-
bugReporter
private final BugReporter bugReporter
-
isEclipseNLS
private boolean isEclipseNLS
Eclipse uses reflection to initialize NLS message bundles. Classes which using this mechanism are usually extending org.eclipse.osgi.util.NLS class and contains lots of public static String fields which are used as message Constants. Unfortunately these fields cannot be final, so FB reports tons of warnings for such Eclipse classes.
-
-
Constructor Detail
-
MutableStaticFields
public MutableStaticFields(BugReporter bugReporter)
-
-
Method Detail
-
extractPackage
static java.lang.String extractPackage(java.lang.String c)
-
visit
public void visit(org.apache.bcel.classfile.JavaClass obj)
- Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Method obj)
- Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Code obj)
- Overrides:
visit
in classDismantleBytecode
-
sawOpcode
public void sawOpcode(int seen)
- Overrides:
sawOpcode
in classDismantleBytecode
-
isCollection
private boolean isCollection(java.lang.String signature)
-
interesting
private boolean interesting(XField f)
-
visit
public void visit(org.apache.bcel.classfile.Field obj)
- Overrides:
visit
in classBetterVisitor
-
report
public void report()
Description copied from interface:Detector
This method is called after all classes to be visited. It should be used by any detectors which accumulate information over all visited classes to generate results.- Specified by:
report
in interfaceDetector
- Overrides:
report
in classBytecodeScanningDetector
-
-