Package edu.umd.cs.findbugs.detect
Class StaticCalendarDetector
- All Implemented Interfaces:
Detector
,Priorities
,org.apache.bcel.classfile.Visitor
Detector for static fields of type
Calendar
or
DateFormat
and their subclasses. Because
Calendar
is unsafe for multithreaded use, static fields
look suspicious. To work correctly, all access would need to be synchronized
by the client which cannot be guaranteed.-
Nested Class Summary
Nested classes/interfaces inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BugAccumulator
private final ClassDescriptor
ObjectType
forCalendar
private CFG
Stores current Control Flow Graphprivate String
Name of the class being inspectedprivate LockDataflow
Stores current LDFprivate org.apache.bcel.classfile.Method
Stores the current methodprivate final ClassDescriptor
ObjectType
forDateFormat
private static final boolean
External Debug flag set?private final Map
<XField, BugInstance> private static final String
External flag to determine whether to skip the test for synchronized blocks (default: if a call on a static Calendar or DateFormat is detected inside a synchronizationb block, it will not be reported).private final BugReporter
The reporter to report toprivate boolean
(package private) Subtypes2
Fields inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
stack
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
ConstructorsConstructorDescriptionStaticCalendarDetector
(BugReporter aReporter) Creates a new instance of this Detector. -
Method Summary
Modifier and TypeMethodDescriptionvoid
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.ConstantPool pool) void
visit
(org.apache.bcel.classfile.Field aField) Checks if the visited field is of typeCalendar
orDateFormat
or a subclass of either one.void
visit
(org.apache.bcel.classfile.JavaClass someObj) Remembers the class name and resets temporary fields.void
visitMethod
(org.apache.bcel.classfile.Method obj) Methods inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
afterOpcode, beforeOpcode, getStack, isUsingCustomUserValue, visitCode
Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, shouldVisitCode, visitClassContext
Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
areOppositeBranches, atCatchBlock, 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
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, 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
-
DEBUG
private static final boolean DEBUGExternal Debug flag set? -
PROP_SKIP_SYNCHRONIZED_CHECK
External flag to determine whether to skip the test for synchronized blocks (default: if a call on a static Calendar or DateFormat is detected inside a synchronizationb block, it will not be reported). Setting this totrue
will report method calls on static fields if they are in a synchronized block. As the check currently does not take into account the lock's mutex it may be useful to switch allow- See Also:
-
reporter
The reporter to report to -
bugAccumulator
-
currentClass
Name of the class being inspected -
calendarType
ObjectType
forCalendar
-
dateFormatType
ObjectType
forDateFormat
-
currentMethod
private org.apache.bcel.classfile.Method currentMethodStores the current method -
currentCFG
Stores current Control Flow Graph -
currentLockDataFlow
Stores current LDF -
pendingBugs
-
subtypes2
Subtypes2 subtypes2 -
sawDateClass
private boolean sawDateClass
-
-
Constructor Details
-
StaticCalendarDetector
Creates a new instance of this Detector.- Parameters:
aReporter
-BugReporter
instance to report found problems to.
-
-
Method Details
-
visit
public void visit(org.apache.bcel.classfile.JavaClass someObj) Remembers the class name and resets temporary fields.- Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.ConstantPool pool) - Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Field aField) Checks if the visited field is of typeCalendar
orDateFormat
or a subclass of either one. If so and the field is static and non-private it is suspicious and will be reported.- Overrides:
visit
in classBetterVisitor
-
visitMethod
public void visitMethod(org.apache.bcel.classfile.Method obj) - Specified by:
visitMethod
in interfaceorg.apache.bcel.classfile.Visitor
- Overrides:
visitMethod
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Code obj) - Overrides:
visit
in classDismantleBytecode
-
sawOpcode
public void sawOpcode(int seen) Checks for method invocations (INVOKEVIRTUAL
) call on a staticCalendar
orDateFormat
fields. TheOpcodeStack
is used to determine if an invocation is done on such a static field.- Specified by:
sawOpcode
in classOpcodeStackDetector
- Parameters:
seen
- An opcode to be analyzed- See Also:
-
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
-