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_UINTEXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITYAALOAD, 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 |
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, shouldVisitCodeafterOpcode, 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, visitgetAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationamVisitingMainMethod, 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, visitStackMapTableEntryclone, 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, visitUnknownprivate 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.DetectorvisitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetectorclassContext - the currently parse classpublic void visitMethod(org.apache.bcel.classfile.Method obj)
visitMethod in interface org.apache.bcel.classfile.VisitorvisitMethod in class edu.umd.cs.findbugs.visitclass.BetterVisitorobj - the currently parsed methodpublic void visitCode(org.apache.bcel.classfile.Code obj)
visitCode in interface org.apache.bcel.classfile.VisitorvisitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitorobj - the currently parsed code blockpublic void sawOpcode(int seen)
sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecodeseen - 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 void removeInheritedInterfaces(java.util.Map<org.apache.bcel.classfile.JavaClass,java.util.List<OverlyConcreteParameter.MethodInfo>> definers) throws java.lang.ClassNotFoundException
java.lang.ClassNotFoundExceptionprivate 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-2017 MeBigFatGuy.com. All Rights Reserved.