@OpcodeStack.CustomUserValue
public class LoggerOddities
extends edu.umd.cs.findbugs.BytecodeScanningDetector
Modifier and Type | Class and Description |
---|---|
(package private) static class |
LoggerOddities.LOUserValue<T> |
Modifier and Type | Field and Description |
---|---|
private static java.util.regex.Pattern |
BAD_FORMATTING_ANCHOR |
private static java.util.regex.Pattern |
BAD_STRING_FORMAT_PATTERN |
private edu.umd.cs.findbugs.BugReporter |
bugReporter |
private static java.lang.String |
COMMONS_LOGGER |
private static java.util.regex.Pattern |
FORMATTER_ANCHOR |
private java.util.Set<java.lang.String> |
formatterLoggers |
private boolean |
isStaticInitializer |
private static java.lang.String |
LOG4J_LOGGER |
private static java.lang.String |
LOG4J2_LOGGER |
private static java.lang.String |
LOG4J2_LOGMANAGER |
private static java.util.Set<java.lang.String> |
LOGGER_METHODS |
private java.lang.String |
nameOfThisClass |
private static java.util.regex.Pattern |
NON_SIMPLE_FORMAT |
private static java.lang.String |
SIG_CLASS_TO_COMMONS_LOGGER |
private static java.lang.String |
SIG_CLASS_TO_LOG4J_LOGGER |
private static java.lang.String |
SIG_CLASS_TO_LOG4J2_LOGGER |
private static java.lang.String |
SIG_CLASS_TO_SLF4J_LOGGER |
private static java.lang.String |
SIG_OBJECT_AND_THROWABLE_TO_VOID |
private static java.lang.String |
SIG_STRING_AND_FACTORY_TO_LOG4J_LOGGER |
private static java.lang.String |
SIG_STRING_AND_OBJECT_ARRAY_TO_VOID |
private static java.lang.String |
SIG_STRING_AND_THROWABLE_TO_VOID |
private static java.lang.String |
SIG_STRING_AND_TWO_OBJECTS_TO_VOID |
private static java.lang.String |
SIG_STRING_TO_COMMONS_LOGGER |
private static java.lang.String |
SIG_STRING_TO_LOG4J_LOGGER |
private static java.lang.String |
SIG_STRING_TO_LOG4J2_LOGGER |
private static java.lang.String |
SIG_STRING_TO_SLF4J_LOGGER |
private static java.lang.String |
SLF4J_LOGGER |
private edu.umd.cs.findbugs.OpcodeStack |
stack |
private org.apache.bcel.classfile.JavaClass |
throwableClass |
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_SYPER, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, APPEND_FRAME, APPEND_FRAME_MAX, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_ANNOTATION_DEFAULT, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_ENCLOSING_METHOD, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_LOCAL_VARIABLE_TYPE_TABLE, ATTR_PMG, ATTR_RUNTIME_VISIBLE_ANNOTATIONS, ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_STACK_MAP_TABLE, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CHOP_FRAME, CHOP_FRAME_MAX, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_Methodref, CONSTANT_MethodType, CONSTANT_NameAndType, CONSTANT_NAMES, CONSTANT_String, CONSTANT_Utf8, CONSTRUCTOR_NAME, CONSUME_STACK, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DLOAD_0, DLOAD_1, DLOAD_2, DLOAD_3, DMUL, DNEG, DREM, DRETURN, DSTORE, DSTORE_0, DSTORE_1, DSTORE_2, DSTORE_3, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAD_0, FLOAD_1, FLOAD_2, FLOAD_3, FMUL, FNEG, FREM, FRETURN, FSTORE, FSTORE_0, FSTORE_1, FSTORE_2, FSTORE_3, FSUB, FULL_FRAME, GETFIELD, GETFIELD_QUICK, GETFIELD_QUICK_W, GETFIELD2_QUICK, GETSTATIC, GETSTATIC_QUICK, GETSTATIC2_QUICK, GOTO, GOTO_W, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILLEGAL_OPCODE, ILLEGAL_TYPE, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMPDEP1, IMPDEP2, IMUL, INEG, INSTANCEOF, INSTANCEOF_QUICK, INT2BYTE, INT2CHAR, INT2SHORT, INTERFACES_IMPLEMENTED_BY_ARRAYS, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKEINTERFACE_QUICK, INVOKENONVIRTUAL, INVOKENONVIRTUAL_QUICK, INVOKESPECIAL, INVOKESTATIC, INVOKESTATIC_QUICK, INVOKESUPER_QUICK, INVOKEVIRTUAL, INVOKEVIRTUAL_QUICK, INVOKEVIRTUAL_QUICK_W, INVOKEVIRTUALOBJECT_QUICK, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, ITEM_Bogus, ITEM_Double, ITEM_Float, ITEM_InitObject, ITEM_Integer, ITEM_Long, ITEM_NAMES, ITEM_NewObject, ITEM_Null, ITEM_Object, IUSHR, IXOR, JSR, JSR_W, KNOWN_ATTRIBUTES, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_QUICK, LDC_W, LDC_W_QUICK, LDC2_W, LDC2_W_QUICK, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LXOR, MAJOR, MAJOR_1_1, MAJOR_1_2, MAJOR_1_3, MAJOR_1_4, MAJOR_1_5, MAJOR_1_6, MAJOR_1_7, MAJOR_1_8, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MINOR_1_4, MINOR_1_5, MINOR_1_6, MINOR_1_7, MINOR_1_8, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, MULTIANEWARRAY_QUICK, NEW, NEW_QUICK, NEWARRAY, NO_OF_OPERANDS, NOP, OPCODE_NAMES, POP, POP2, PRODUCE_STACK, PUSH, PUTFIELD, PUTFIELD_QUICK, PUTFIELD_QUICK_W, PUTFIELD2_QUICK, PUTSTATIC, PUTSTATIC_QUICK, PUTSTATIC2_QUICK, RESERVED, RET, RETURN, SALOAD, SAME_FRAME, SAME_FRAME_EXTENDED, SAME_FRAME_MAX, SAME_LOCALS_1_STACK_ITEM_FRAME, SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED, SAME_LOCALS_1_STACK_ITEM_FRAME_MAX, SASTORE, SHORT_TYPE_NAMES, SIPUSH, STATIC_INITIALIZER_NAME, SWAP, SWITCH, T_ADDRESS, T_ARRAY, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_OBJECT, T_REFERENCE, T_SHORT, T_UNKNOWN, T_VOID, TABLESWITCH, TYPE_NAMES, TYPE_OF_OPERANDS, UNDEFINED, UNPREDICTABLE, WIDE
Constructor and Description |
---|
LoggerOddities(edu.umd.cs.findbugs.BugReporter bugReporter)
constructs a LO detector given the reporter to report bugs on.
|
Modifier and Type | Method and Description |
---|---|
private void |
checkForLoggerParam()
looks for slf4j calls where an exception is passed as a logger parameter, expecting to be substituted for a {} marker.
|
private void |
checkForProblemsWithLoggerMethods()
looks for a variety of logging issues with log statements
|
private void |
checkForProblemsWithLoggerParameterisedMethods(java.lang.String sig) |
private void |
checkForProblemsWithLoggerSingleArgumentMethod() |
private void |
checkForProblemsWithLoggerThrowableMethods() |
private static int |
countAnchors(java.lang.String formatString)
returns the number of anchors {} in a string
|
private java.lang.String |
getLoggingClassNameFromStackValue() |
private int |
getVarArgsParmCount(java.lang.String signature)
returns the number of parameters slf4j or log4j2 is expecting to inject into the format string
|
private boolean |
hasExceptionOnStack()
returns whether an exception object is on the stack slf4j will find this, and not include it in the parm list so i we find one, just don't report
|
private boolean |
isLoggerWithClassParm(edu.umd.cs.findbugs.ba.XMethod m)
returns whether this method class is a standard logger instantiation that takes a java/lang/Class parameter
|
private boolean |
isNonPrivateLogField(java.lang.String fieldClsName,
java.lang.String fieldName,
java.lang.String fieldSig)
looks to see if this field is a logger, and declared non privately
|
private void |
lookForSuspectClasses()
looks for instantiation of a logger with what looks like a class name that isn't the same as the class in which it exists.
|
void |
sawOpcode(int seen)
implements the visitor to look for calls to Logger.getLogger with the wrong class name
|
void |
visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
implements the visitor to discover what the class name is if it is a normal class, or the owning class, if the class is an anonymous class.
|
void |
visitCode(org.apache.bcel.classfile.Code obj)
implements the visitor to reset the stack
|
getClassContext, report, shouldVisitCode
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, visit
getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation
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, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitStackMapTable, visitStackMapTableEntry
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, visitMethod, visitSignature, visitSourceFile, visitStackMap, visitStackMapEntry, visitSynthetic, visitUnknown
private static final java.util.Set<java.lang.String> LOGGER_METHODS
private static final java.lang.String COMMONS_LOGGER
private static final java.lang.String LOG4J_LOGGER
private static final java.lang.String LOG4J2_LOGGER
private static final java.lang.String LOG4J2_LOGMANAGER
private static final java.lang.String SLF4J_LOGGER
private static final java.lang.String SIG_STRING_AND_TWO_OBJECTS_TO_VOID
private static final java.lang.String SIG_STRING_AND_OBJECT_ARRAY_TO_VOID
private static final java.lang.String SIG_OBJECT_AND_THROWABLE_TO_VOID
private static final java.lang.String SIG_STRING_AND_THROWABLE_TO_VOID
private static final java.lang.String SIG_CLASS_TO_COMMONS_LOGGER
private static final java.lang.String SIG_CLASS_TO_LOG4J_LOGGER
private static final java.lang.String SIG_CLASS_TO_LOG4J2_LOGGER
private static final java.lang.String SIG_CLASS_TO_SLF4J_LOGGER
private static final java.lang.String SIG_STRING_TO_COMMONS_LOGGER
private static final java.lang.String SIG_STRING_TO_LOG4J_LOGGER
private static final java.lang.String SIG_STRING_TO_LOG4J2_LOGGER
private static final java.lang.String SIG_STRING_TO_SLF4J_LOGGER
private static final java.lang.String SIG_STRING_AND_FACTORY_TO_LOG4J_LOGGER
private static final java.util.regex.Pattern BAD_FORMATTING_ANCHOR
private static final java.util.regex.Pattern BAD_STRING_FORMAT_PATTERN
private static final java.util.regex.Pattern FORMATTER_ANCHOR
private static final java.util.regex.Pattern NON_SIMPLE_FORMAT
private final edu.umd.cs.findbugs.BugReporter bugReporter
private java.util.Set<java.lang.String> formatterLoggers
private org.apache.bcel.classfile.JavaClass throwableClass
private edu.umd.cs.findbugs.OpcodeStack stack
private java.lang.String nameOfThisClass
private boolean isStaticInitializer
public LoggerOddities(edu.umd.cs.findbugs.BugReporter bugReporter)
bugReporter
- the sync of bug reportspublic void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
visitClassContext
in interface edu.umd.cs.findbugs.Detector
visitClassContext
in class edu.umd.cs.findbugs.BytecodeScanningDetector
classContext
- the context object of the currently parsed classpublic void visitCode(org.apache.bcel.classfile.Code obj)
visitCode
in interface org.apache.bcel.classfile.Visitor
visitCode
in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
obj
- the context object of the currently parsed code blockpublic void sawOpcode(int seen)
sawOpcode
in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
seen
- the opcode of the currently parsed instructionprivate boolean isNonPrivateLogField(@SlashedClassName java.lang.String fieldClsName, java.lang.String fieldName, java.lang.String fieldSig)
fieldClsName
- the owning class type of the fieldfieldName
- the name of the fieldfieldSig
- the signature of the fieldprivate boolean isLoggerWithClassParm(edu.umd.cs.findbugs.ba.XMethod m)
m
- the method to checkprivate void checkForProblemsWithLoggerMethods() throws java.lang.ClassNotFoundException
java.lang.ClassNotFoundException
- if the exception class, or a parent class can't be foundprivate void checkForProblemsWithLoggerThrowableMethods()
private void checkForProblemsWithLoggerSingleArgumentMethod() throws java.lang.ClassNotFoundException
java.lang.ClassNotFoundException
private void checkForProblemsWithLoggerParameterisedMethods(java.lang.String sig)
private void checkForLoggerParam()
private void lookForSuspectClasses()
@Nullable private java.lang.String getLoggingClassNameFromStackValue()
private static int countAnchors(java.lang.String formatString)
formatString
- the format stringprivate int getVarArgsParmCount(java.lang.String signature)
signature
- the method signature of the error, warn, info, debug statementprivate boolean hasExceptionOnStack()
Copyright © 2005-2018 MeBigFatGuy.com. All Rights Reserved.