public class OverlyConcreteParameter
extends edu.umd.cs.findbugs.BytecodeScanningDetector
Modifier and Type | Class and Description |
---|---|
(package private) static class |
OverlyConcreteParameter.MethodInfo
an inner helper class that holds basic information about a method
|
Modifier and Type | Field and Description |
---|---|
private edu.umd.cs.findbugs.BugReporter |
bugReporter |
private org.apache.bcel.classfile.JavaClass |
cls |
private org.apache.bcel.classfile.JavaClass[] |
constrainingClasses |
private static java.util.Set<java.lang.String> |
CONVERSION_ANNOTATIONS |
private static java.util.Set<java.lang.String> |
CONVERSION_SUPER_CLASSES |
private boolean |
methodIsStatic |
private boolean |
methodSignatureIsConstrained |
private org.apache.bcel.classfile.JavaClass |
objectClass |
private java.util.Map<java.lang.Integer,java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>>> |
parameterDefiners |
private int |
parmCount |
private edu.umd.cs.findbugs.OpcodeStack |
stack |
private java.util.BitSet |
usedParameters |
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 |
---|
OverlyConcreteParameter(edu.umd.cs.findbugs.BugReporter bugReporter)
constructs a OCP detector given the reporter to report bugs on
|
Modifier and Type | Method and Description |
---|---|
private boolean |
buildParameterDefiners()
builds a map of method information for each method of each interface that each parameter implements of this method
|
private static java.lang.String |
getCardinality(int num)
returns a string defining what parameter in the signature a certain one is, for the bug report
|
private static java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>> |
getClassDefiners(org.apache.bcel.classfile.JavaClass cls)
returns a map of method information for each public method for each interface this class implements
|
private static java.util.List<OverlyConcreteParameter.MethodInfo> |
getPublicMethodInfos(org.apache.bcel.classfile.JavaClass cls)
returns a list of method information of all public or protected methods in this class
|
private boolean |
hasOverloadedMethod()
looks to see if this method has an overloaded method in actuality, this isn't precise and returns true for methods that are named the same, and have same
number of args This will miss some cases, but in practicality doesn't matter.
|
private boolean |
isaConversionClass(org.apache.bcel.classfile.JavaClass conversionCls)
returns whether this class is used to convert types of some sort, such that you don't want to suggest reducing the class specified to be more generic
|
private boolean |
isExceptionHandled(java.lang.String ex)
returns whether this exception is handled either in a try/catch or throws clause at this pc
|
private boolean |
methodHasSyntheticTwin(java.lang.String methodName,
java.lang.String methodSig)
returns whether this method has an equivalent method that is synthetic, which implies this method is constrained by some Generified interface.
|
private static boolean |
methodIsSpecial(java.lang.String methodName,
java.lang.String methodSig)
determines whether the method is a baked in special method of the jdk
|
private void |
removeInheritedInterfaces(java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>> definers) |
private void |
removeUselessDefiners(int reg)
parses through the interface that 'may' define a parameter defined by reg, and look to see if we can rule it out, because a method is called on the
object that can't be satisfied by the interface, if so remove that candidate interface.
|
private void |
removeUselessDefiners(java.lang.String parmSig,
int reg) |
private void |
reportBugs()
implements the post processing steps to report the remaining unremoved parameter definers, ie those, that can be defined more abstractly.
|
void |
sawOpcode(int seen)
implements the visitor to filter out parameter use where the actual defined type of the method declaration is needed.
|
void |
visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
implements the visitor to collect classes that constrains this class (super classes/interfaces) and to reset the opcode stack
|
void |
visitCode(org.apache.bcel.classfile.Code obj)
implements the visitor to collect information about the parameters of a this method
|
void |
visitMethod(org.apache.bcel.classfile.Method obj)
implements the visitor to look to see if this method is constrained by a superclass or interface.
|
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, visitSignature, visitSourceFile, visitStackMap, visitStackMapEntry, visitSynthetic, visitUnknown
private static final java.util.Set<java.lang.String> CONVERSION_ANNOTATIONS
private static final java.util.Set<java.lang.String> CONVERSION_SUPER_CLASSES
private final edu.umd.cs.findbugs.BugReporter bugReporter
private org.apache.bcel.classfile.JavaClass[] constrainingClasses
private java.util.Map<java.lang.Integer,java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>>> parameterDefiners
private java.util.BitSet usedParameters
private org.apache.bcel.classfile.JavaClass objectClass
private org.apache.bcel.classfile.JavaClass cls
private edu.umd.cs.findbugs.OpcodeStack stack
private int parmCount
private boolean methodSignatureIsConstrained
private boolean methodIsStatic
public OverlyConcreteParameter(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 currently parse classpublic void visitMethod(org.apache.bcel.classfile.Method obj)
visitMethod
in interface org.apache.bcel.classfile.Visitor
visitMethod
in class edu.umd.cs.findbugs.visitclass.BetterVisitor
obj
- the currently parsed methodpublic 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 currently parsed code blockpublic void sawOpcode(int seen)
sawOpcode
in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
seen
- the currently parsed opcodeprivate static boolean methodIsSpecial(java.lang.String methodName, java.lang.String methodSig)
methodName
- the method name to checkmethodSig
- the parameter signature of the method to checkprivate boolean methodHasSyntheticTwin(java.lang.String methodName, java.lang.String methodSig)
methodName
- the method name to look for a synthetic twin ofmethodSig
- the method signature to lookfor a synthetic twin ofprivate void reportBugs()
private boolean hasOverloadedMethod()
private void removeInheritedInterfaces(java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>> definers) throws java.lang.ClassNotFoundException
java.lang.ClassNotFoundException
private static java.lang.String getCardinality(int num)
num
- the parameter numberprivate boolean buildParameterDefiners() throws java.lang.ClassNotFoundException
java.lang.ClassNotFoundException
- if the class can't be loadedprivate static java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>> getClassDefiners(org.apache.bcel.classfile.JavaClass cls) throws java.lang.ClassNotFoundException
cls
- the class whose interfaces to recordjava.lang.ClassNotFoundException
- if unable to load the classprivate static java.util.List<OverlyConcreteParameter.MethodInfo> getPublicMethodInfos(org.apache.bcel.classfile.JavaClass cls)
cls
- the class to look for methodsprivate void removeUselessDefiners(int reg)
reg
- the parameter register number to look atprivate boolean isExceptionHandled(java.lang.String ex)
ex
- the name of the exceptionprivate void removeUselessDefiners(java.lang.String parmSig, int reg)
private boolean isaConversionClass(org.apache.bcel.classfile.JavaClass conversionCls)
conversionCls
- the class to checkCopyright © 2005-2018 MeBigFatGuy.com. All Rights Reserved.