Package edu.umd.cs.findbugs.detect
Class StaticCalendarDetector
- java.lang.Object
-
- All Implemented Interfaces:
Detector,Priorities,org.apache.bcel.classfile.Visitor
public class StaticCalendarDetector extends OpcodeStackDetector
Detector for static fields of typeCalendarorDateFormatand their subclasses. BecauseCalendaris 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
Fields Modifier and Type Field Description private BugAccumulatorbugAccumulatorprivate ClassDescriptorcalendarTypeObjectTypeforCalendarprivate CFGcurrentCFGStores current Control Flow Graphprivate java.lang.StringcurrentClassName of the class being inspectedprivate LockDataflowcurrentLockDataFlowStores current LDFprivate org.apache.bcel.classfile.MethodcurrentMethodStores the current methodprivate ClassDescriptordateFormatTypeObjectTypeforDateFormatprivate static booleanDEBUGExternal Debug flag set?private java.util.Map<XField,BugInstance>pendingBugsprivate static java.lang.StringPROP_SKIP_SYNCHRONIZED_CHECKExternal 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 BugReporterreporterThe reporter to report toprivate booleansawDateClass(package private) Subtypes2subtypes2-
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
Constructors Constructor Description StaticCalendarDetector(BugReporter aReporter)Creates a new instance of this Detector.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidreport()This method is called after all classes to be visited.voidsawOpcode(int seen)Checks for method invocations (INVOKEVIRTUAL) call on a staticCalendarorDateFormatfields.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 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 Detail
-
DEBUG
private static final boolean DEBUG
External Debug flag set?
-
PROP_SKIP_SYNCHRONIZED_CHECK
private static final java.lang.String 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:
- Constant Field Values
-
reporter
private final BugReporter reporter
The reporter to report to
-
bugAccumulator
private final BugAccumulator bugAccumulator
-
currentClass
private java.lang.String currentClass
Name of the class being inspected
-
calendarType
private final ClassDescriptor calendarType
ObjectTypeforCalendar
-
dateFormatType
private final ClassDescriptor dateFormatType
ObjectTypeforDateFormat
-
currentMethod
private org.apache.bcel.classfile.Method currentMethod
Stores the current method
-
currentCFG
private CFG currentCFG
Stores current Control Flow Graph
-
currentLockDataFlow
private LockDataflow currentLockDataFlow
Stores current LDF
-
pendingBugs
private final java.util.Map<XField,BugInstance> pendingBugs
-
subtypes2
Subtypes2 subtypes2
-
sawDateClass
private boolean sawDateClass
-
-
Constructor Detail
-
StaticCalendarDetector
public StaticCalendarDetector(BugReporter aReporter)
Creates a new instance of this Detector.- Parameters:
aReporter-BugReporterinstance to report found problems to.
-
-
Method Detail
-
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:
DismantleBytecode.sawOpcode(int)
-
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
-
-