Package com.mebigfatguy.fbcontrib.detect
Class CopiedOverriddenMethod
java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.CopiedOverriddenMethod
- All Implemented Interfaces:
edu.umd.cs.findbugs.Detector,edu.umd.cs.findbugs.Priorities,org.apache.bcel.classfile.Visitor
public class CopiedOverriddenMethod
extends edu.umd.cs.findbugs.BytecodeScanningDetector
Looks for methods that are direct copies of the implementation in the super
class. This detector doesn't handle multi-level inheritance, ie child to
grandparent. Could be done.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static classrepresents of code bytes and access flag for a method -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final edu.umd.cs.findbugs.BugReporterprivate org.apache.bcel.generic.ConstantPoolGenprivate edu.umd.cs.findbugs.ba.ClassContextprivate Stringprivate intprivate intprivate org.apache.bcel.generic.ConstantPoolGenprivate org.apache.bcel.generic.Type[]private booleanprivate booleanprivate Map<String, CopiedOverriddenMethod.CodeInfo> Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINTFields inherited from interface edu.umd.cs.findbugs.Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY -
Constructor Summary
ConstructorsConstructorDescriptionCopiedOverriddenMethod(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a COM detector given the reporter to report bugs on -
Method Summary
Modifier and TypeMethodDescriptionprivate booleancodeEquals(org.apache.bcel.classfile.Code child, org.apache.bcel.classfile.Code parent) compares two code blocks to see if they are equal with regard to instructions and field accessesprivate static booleancoversExceptions(org.apache.bcel.classfile.ExceptionTable thisExceptions, CopiedOverriddenMethod.CodeInfo superInfo) determines if the parents exceptions are represented in the child's exceptions if will false negative, if the child throws clause contains all the subclasses of a parents throws clauseprivate static intgetExpectedReturnInstruction(org.apache.bcel.generic.Type type) private booleanisExpectedParmInstruction(int offsetConstant, int constant, int seen, int parmOffset) private booleanisExpectedParmInstruction(int seen, int parmOffset, org.apache.bcel.generic.Type type) private static booleansameAccess(int parentAccess, int childAccess) determines if two access flags contain the same access modifiersvoidsawOpcode(int seen) overrides the visitor to look for an exact call to the parent class's method using this methods parm.voidvisitClassContext(edu.umd.cs.findbugs.ba.ClassContext clsContext) overrides the visitor to accept classes derived from non java.lang.Object classes.voidvisitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to find code blocks of methods that are the same as its parentsvoidvisitMethod(org.apache.bcel.classfile.Method obj) overrides the visitor to get the methodInfoMethods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, report, shouldVisitCodeMethods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
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, visitMethods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor
getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationMethods 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, visitStackMapEntryMethods 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, 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 java.lang.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
-
bugReporter
private final edu.umd.cs.findbugs.BugReporter bugReporter -
superclassCode
-
classContext
private edu.umd.cs.findbugs.ba.ClassContext classContext -
curMethodInfo
-
childPoolGen
private org.apache.bcel.generic.ConstantPoolGen childPoolGen -
parentPoolGen
private org.apache.bcel.generic.ConstantPoolGen parentPoolGen -
parmTypes
private org.apache.bcel.generic.Type[] parmTypes -
nextParmIndex
private int nextParmIndex -
nextParmOffset
private int nextParmOffset -
sawAload0
private boolean sawAload0 -
sawParentCall
private boolean sawParentCall
-
-
Constructor Details
-
CopiedOverriddenMethod
public CopiedOverriddenMethod(edu.umd.cs.findbugs.BugReporter bugReporter) constructs a COM detector given the reporter to report bugs on- Parameters:
bugReporter- the sync of bug reports
-
-
Method Details
-
visitClassContext
public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext clsContext) overrides the visitor to accept classes derived from non java.lang.Object classes.- Specified by:
visitClassContextin interfaceedu.umd.cs.findbugs.Detector- Overrides:
visitClassContextin classedu.umd.cs.findbugs.BytecodeScanningDetector- Parameters:
clsContext- the context object of the currently parsed class
-
visitMethod
public void visitMethod(org.apache.bcel.classfile.Method obj) overrides the visitor to get the methodInfo- Specified by:
visitMethodin interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitMethodin classedu.umd.cs.findbugs.visitclass.BetterVisitor- Parameters:
obj- the method object for the currently parsed method
-
visitCode
public void visitCode(org.apache.bcel.classfile.Code obj) overrides the visitor to find code blocks of methods that are the same as its parents- Specified by:
visitCodein interfaceorg.apache.bcel.classfile.Visitor- Overrides:
visitCodein classedu.umd.cs.findbugs.visitclass.PreorderVisitor- Parameters:
obj- the code object of the currently parsed method
-
sawOpcode
public void sawOpcode(int seen) overrides the visitor to look for an exact call to the parent class's method using this methods parm.- Overrides:
sawOpcodein classedu.umd.cs.findbugs.visitclass.DismantleBytecode- Parameters:
seen- the currently parsed instruction
-
isExpectedParmInstruction
private boolean isExpectedParmInstruction(int seen, int parmOffset, org.apache.bcel.generic.Type type) -
isExpectedParmInstruction
private boolean isExpectedParmInstruction(int offsetConstant, int constant, int seen, int parmOffset) -
getExpectedReturnInstruction
private static int getExpectedReturnInstruction(org.apache.bcel.generic.Type type) -
sameAccess
private static boolean sameAccess(int parentAccess, int childAccess) determines if two access flags contain the same access modifiers- Parameters:
parentAccess- the access flags of the parent methodchildAccess- the access flats of the child method- Returns:
- whether the access modifiers are the same
-
coversExceptions
private static boolean coversExceptions(org.apache.bcel.classfile.ExceptionTable thisExceptions, CopiedOverriddenMethod.CodeInfo superInfo) determines if the parents exceptions are represented in the child's exceptions if will false negative, if the child throws clause contains all the subclasses of a parents throws clause- Parameters:
thisExceptions- the exception table found in this class's methodsuperInfo- the code info for the super class method- Returns:
- whether all the super classes throws clauses are declared by the child
-
codeEquals
private boolean codeEquals(org.apache.bcel.classfile.Code child, org.apache.bcel.classfile.Code parent) compares two code blocks to see if they are equal with regard to instructions and field accesses- Parameters:
child- the first code blockparent- the second code block- Returns:
- whether the code blocks are the same
-