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 Classes
    Modifier and Type
    Class
    Description
    (package private) static class 
    represents of code bytes and access flag for a method
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final edu.umd.cs.findbugs.BugReporter
     
    private org.apache.bcel.generic.ConstantPoolGen
     
    private edu.umd.cs.findbugs.ba.ClassContext
     
    private String
     
    private int
     
    private int
     
    private org.apache.bcel.generic.ConstantPoolGen
     
    private org.apache.bcel.generic.Type[]
     
    private boolean
     
    private boolean
     
     

    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
    CopiedOverriddenMethod(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a COM detector given the reporter to report bugs on
  • Method Summary

    Modifier and Type
    Method
    Description
    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
    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
    private static int
    getExpectedReturnInstruction(org.apache.bcel.generic.Type type)
     
    private boolean
    isExpectedParmInstruction(int offsetConstant, int constant, int seen, int parmOffset)
     
    private boolean
    isExpectedParmInstruction(int seen, int parmOffset, org.apache.bcel.generic.Type type)
     
    private static boolean
    sameAccess(int parentAccess, int childAccess)
    determines if two access flags contain the same access modifiers
    void
    sawOpcode(int seen)
    overrides the visitor to look for an exact call to the parent class's method using this methods parm.
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext clsContext)
    overrides the visitor to accept classes derived from non java.lang.Object classes.
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    overrides the visitor to find code blocks of methods that are the same as its parents
    void
    visitMethod(org.apache.bcel.classfile.Method obj)
    overrides the visitor to get the methodInfo

    Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

    getClassContext, report, shouldVisitCode

    Methods 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, visit

    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, 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 Details

    • bugReporter

      private final edu.umd.cs.findbugs.BugReporter bugReporter
    • superclassCode

      private Map<String,CopiedOverriddenMethod.CodeInfo> superclassCode
    • classContext

      private edu.umd.cs.findbugs.ba.ClassContext classContext
    • curMethodInfo

      private String 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:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.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:
      visitMethod in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitMethod in class edu.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:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.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:
      sawOpcode in class edu.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 method
      childAccess - 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 method
      superInfo - 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 block
      parent - the second code block
      Returns:
      whether the code blocks are the same