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 OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BugAccumulatorprivate final ClassDescriptorObjectTypeforCalendarprivate CFGStores current Control Flow Graphprivate StringName of the class being inspectedprivate LockDataflowStores current LDFprivate org.apache.bcel.classfile.MethodStores the current methodprivate final ClassDescriptorObjectTypeforDateFormatprivate static final booleanExternal Debug flag set?private final Map<XField, BugInstance> private static final StringExternal 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 BugReporterThe reporter to report toprivate boolean(package private) Subtypes2Fields inherited from class OpcodeStackDetector
stackFields inherited from class DismantleBytecode
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINTFields inherited from interface 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 TypeMethodDescriptionvoidreport()This method is called after all classes to be visited.voidsawOpcode(int seen) voidvisit(org.apache.bcel.classfile.Code obj) voidvisit(org.apache.bcel.classfile.ConstantPool pool) voidvisit(org.apache.bcel.classfile.Field aField) Checks if the visited field is of typeCalendarorDateFormator a subclass of either one.voidvisit(org.apache.bcel.classfile.JavaClass someObj) Remembers the class name and resets temporary fields.voidvisitMethod(org.apache.bcel.classfile.Method obj) Methods inherited from class OpcodeStackDetector
afterOpcode, beforeOpcode, getStack, isUsingCustomUserValue, visitCodeMethods inherited from class BytecodeScanningDetector
getClassContext, shouldVisitCode, visitClassContextMethods inherited from class 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, sawStringMethods inherited from class AnnotationVisitor
getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationMethods inherited from class 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 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, visitUnknownMethods inherited from class 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
-
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 totruewill 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
ObjectTypeforCalendar -
dateFormatType
ObjectTypeforDateFormat -
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-BugReporterinstance 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:
visitin classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.ConstantPool pool) - Overrides:
visitin classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Field aField) Checks if the visited field is of typeCalendarorDateFormator a subclass of either one. If so and the field is static and non-private it is suspicious and will be reported.- Overrides:
visitin classBetterVisitor
-
visitMethod
public void visitMethod(org.apache.bcel.classfile.Method obj) - Specified by:
visitMethodin interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitMethodin classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Code obj) - Overrides:
visitin classDismantleBytecode
-
sawOpcode
public void sawOpcode(int seen) Checks for method invocations (INVOKEVIRTUAL) call on a staticCalendarorDateFormatfields. TheOpcodeStackis used to determine if an invocation is done on such a static field.- Specified by:
sawOpcodein classOpcodeStackDetector- Parameters:
seen- An opcode to be analyzed- See Also:
-
report
public void report()Description copied from interface:DetectorThis 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:
reportin interfaceDetector- Overrides:
reportin classBytecodeScanningDetector
-