Class OverlyPermissiveMethod

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.OverlyPermissiveMethod
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

public class OverlyPermissiveMethod extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for methods that are declared more permissively than the code is using. For instance, declaring a method public, when it could just be declared private.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private edu.umd.cs.findbugs.BugReporter
     
    private String
     
    private String
     
    private org.apache.bcel.classfile.JavaClass
     
    private static Map<Integer,String>
     
    private edu.umd.cs.findbugs.OpcodeStack
     

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

    Modifier and Type
    Method
    Description
    private org.apache.bcel.classfile.BootstrapMethod
    getBootstrapMethod(int bootstrapIndex)
     
    private static String
    getDeclaredAccessValue(int declaredAccess)
     
    private org.apache.bcel.classfile.ConstantMethodHandle
    getFirstMethodHandle(org.apache.bcel.classfile.ConstantPool pool, org.apache.bcel.classfile.BootstrapMethod bm)
     
    private static Object
     
    private boolean
    hasRuntimeAnnotations(org.apache.bcel.classfile.Method obj)
     
    private boolean
    isAssumedPublic(String methodName)
     
    private boolean
    checks to see if an instance method is called on the 'this' object
    private boolean
    looks to see if this method is an implementation of a method in an interface, including generic specified interface methods.
    private boolean
    isDerived(org.apache.bcel.classfile.JavaClass fqCls, FQMethod key)
    looks to see if this method described by key is derived from a superclass or interface
    private boolean
    isGetterSetter(String methodName, String methodSignature)
     
    private static boolean
    isOverlyPermissive(int declaredAccess)
     
    void
    after collecting all method calls, build a report of all methods that have been called, but in a way that is less permissive then is defined.
    void
    sawOpcode(int seen)
     
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
     
    void
    visitCode(org.apache.bcel.classfile.Code obj)
     

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

    getClassContext, 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, visitMethod, 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

    • DECLARED_ACCESS

      private static Map<Integer,String> DECLARED_ACCESS
    • bugReporter

      private edu.umd.cs.findbugs.BugReporter bugReporter
    • stack

      private edu.umd.cs.findbugs.OpcodeStack stack
    • cls

      private org.apache.bcel.classfile.JavaClass cls
    • callingPackage

      private String callingPackage
    • callingClass

      private String callingClass
  • Constructor Details

    • OverlyPermissiveMethod

      public OverlyPermissiveMethod(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a OPM 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 classContext)
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
    • sawOpcode

      public void sawOpcode(int seen)
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
    • hasRuntimeAnnotations

      private boolean hasRuntimeAnnotations(org.apache.bcel.classfile.Method obj)
    • isAssumedPublic

      private boolean isAssumedPublic(String methodName)
    • isGetterSetter

      private boolean isGetterSetter(String methodName, String methodSignature)
    • isCallingOnThis

      private boolean isCallingOnThis(String sig)
      checks to see if an instance method is called on the 'this' object
      Parameters:
      sig - the signature of the method called to find the called-on object
      Returns:
      when it is called on this or not
    • report

      public void report()
      after collecting all method calls, build a report of all methods that have been called, but in a way that is less permissive then is defined.
      Specified by:
      report in interface edu.umd.cs.findbugs.Detector
      Overrides:
      report in class edu.umd.cs.findbugs.BytecodeScanningDetector
    • isOverlyPermissive

      private static boolean isOverlyPermissive(int declaredAccess)
    • isConstrainedByInterface

      private boolean isConstrainedByInterface(FQMethod fqMethod)
      looks to see if this method is an implementation of a method in an interface, including generic specified interface methods.
      Parameters:
      fqMethod - the method to check
      Returns:
      if this method is constrained by an interface method
    • isDerived

      private boolean isDerived(org.apache.bcel.classfile.JavaClass fqCls, FQMethod key)
      looks to see if this method described by key is derived from a superclass or interface
      Parameters:
      fqCls - the class that the method is defined in
      key - the information about the method
      Returns:
      whether this method derives from something or not
    • getDeclaredAccessValue

      private static String getDeclaredAccessValue(int declaredAccess)
    • getRequiredAccessValue

      private static Object getRequiredAccessValue(MethodInfo mi)
    • getBootstrapMethod

      @Nullable private org.apache.bcel.classfile.BootstrapMethod getBootstrapMethod(int bootstrapIndex)
    • getFirstMethodHandle

      private org.apache.bcel.classfile.ConstantMethodHandle getFirstMethodHandle(org.apache.bcel.classfile.ConstantPool pool, org.apache.bcel.classfile.BootstrapMethod bm)