Package edu.umd.cs.findbugs.detect
Class FindNoSideEffectMethods
- java.lang.Object
-
- All Implemented Interfaces:
Detector,FirstPassDetector,NonReportingDetector,Priorities,org.apache.bcel.classfile.Visitor
public class FindNoSideEffectMethods extends OpcodeStackDetector implements NonReportingDetector
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static classFindNoSideEffectMethods.EarlyExitExceptionprivate static classFindNoSideEffectMethods.MethodCallstatic classFindNoSideEffectMethods.MethodSideEffectStatusPublic status of the method in NSE database TODO: implement CHECKstatic classFindNoSideEffectMethods.NoSideEffectMethodsDatabaseprivate static classFindNoSideEffectMethods.SideEffectStatus-
Nested classes/interfaces inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo
-
-
Field Summary
-
Fields inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
stack
-
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 FindNoSideEffectMethods(BugReporter bugReporter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static intchangedArg(MethodDescriptor m)private booleanchangesOnlyNewObjects(MethodDescriptor methodDescriptor)private voidcomputeFinalStatus()private FindNoSideEffectMethods.MethodCallgetMethodCall(MethodDescriptor methodDescriptorOperand)private voidhandleStatus()private static booleanhasNoSideEffect(MethodDescriptor m)private static booleanhasNoSideEffectUnknown(MethodDescriptor m)private static booleanhasOtherImplementations(XMethod xMethod)private static booleanisNew(OpcodeStack.Item item)private static booleanisObjectOnlyClass(java.lang.String className)private static booleanisObjectOnlyMethod(MethodDescriptor m)voidreport()This method is called after all classes to be visited.private voidsawCall(FindNoSideEffectMethods.MethodCall methodCall, boolean finalPass)private voidsawNoSideEffectCall(MethodDescriptor methodDescriptor)voidsawOpcode(int seen)By default, this method will not be called when stack is TOP.private voidsawUnsureCall(FindNoSideEffectMethods.MethodCall methodCall)private voidsuperClinitCall()voidvisit(org.apache.bcel.classfile.Code obj)voidvisit(org.apache.bcel.classfile.Field obj)voidvisit(org.apache.bcel.classfile.JavaClass obj)voidvisit(org.apache.bcel.classfile.Method method)voidvisitAfter(org.apache.bcel.classfile.JavaClass obj)-
Methods inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
afterOpcode, beforeOpcode, getStack, isUsingCustomUserValue, visitCode
-
Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector
getClassContext, shouldVisitCode, visitClassContext
-
Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode
areOppositeBranches, atCatchBlock, 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
-
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, 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, 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 Detail
-
GET_CLASS
private static final MethodDescriptor GET_CLASS
-
ARRAY_COPY
private static final MethodDescriptor ARRAY_COPY
-
HASH_CODE
private static final MethodDescriptor HASH_CODE
-
CLASS_GET_NAME
private static final MethodDescriptor CLASS_GET_NAME
-
ARRAY_STORE_STUB_METHOD
private static final MethodDescriptor ARRAY_STORE_STUB_METHOD
-
FIELD_STORE_STUB_METHOD
private static final MethodDescriptor FIELD_STORE_STUB_METHOD
-
TARGET_THIS
private static final FieldDescriptor TARGET_THIS
-
TARGET_NEW
private static final FieldDescriptor TARGET_NEW
-
TARGET_OTHER
private static final FieldDescriptor TARGET_OTHER
-
NUMBER_CLASSES
private static final java.util.Set<java.lang.String> NUMBER_CLASSES
-
ALLOWED_EXCEPTIONS
private static final java.util.Set<java.lang.String> ALLOWED_EXCEPTIONS
-
NO_SIDE_EFFECT_COLLECTION_METHODS
private static final java.util.Set<java.lang.String> NO_SIDE_EFFECT_COLLECTION_METHODS
-
OBJECT_ONLY_CLASSES
private static final java.util.Set<java.lang.String> OBJECT_ONLY_CLASSES
-
STUB_METHODS
private static final byte[][] STUB_METHODS
-
OBJECT_ONLY_METHODS
private static final java.util.Set<MethodDescriptor> OBJECT_ONLY_METHODS
Known methods which change only this object
-
NO_SIDE_EFFECT_METHODS
private static final java.util.Set<MethodDescriptor> NO_SIDE_EFFECT_METHODS
Known methods which have no side-effect
-
NEW_OBJECT_RETURNING_METHODS
private static final java.util.Set<MethodDescriptor> NEW_OBJECT_RETURNING_METHODS
-
statusMap
private final java.util.Map<MethodDescriptor,FindNoSideEffectMethods.SideEffectStatus> statusMap
-
callGraph
private final java.util.Map<MethodDescriptor,java.util.List<FindNoSideEffectMethods.MethodCall>> callGraph
-
getStaticMethods
private final java.util.Set<MethodDescriptor> getStaticMethods
-
uselessVoidCandidates
private final java.util.Set<MethodDescriptor> uselessVoidCandidates
-
status
private FindNoSideEffectMethods.SideEffectStatus status
-
calledMethods
private java.util.ArrayList<FindNoSideEffectMethods.MethodCall> calledMethods
-
subtypes
private java.util.Set<ClassDescriptor> subtypes
-
finallyTargets
private java.util.Set<java.lang.Integer> finallyTargets
-
finallyExceptionRegisters
private java.util.Set<java.lang.Integer> finallyExceptionRegisters
-
constructor
private boolean constructor
-
uselessVoidCandidate
private boolean uselessVoidCandidate
-
classInit
private boolean classInit
-
allowedFields
private java.util.Set<FieldDescriptor> allowedFields
-
fieldsModifyingMethods
private java.util.Set<MethodDescriptor> fieldsModifyingMethods
-
noSideEffectMethods
private final FindNoSideEffectMethods.NoSideEffectMethodsDatabase noSideEffectMethods
-
-
Constructor Detail
-
FindNoSideEffectMethods
public FindNoSideEffectMethods(BugReporter bugReporter)
-
-
Method Detail
-
visit
public void visit(org.apache.bcel.classfile.JavaClass obj)
- Overrides:
visitin classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Method method)
- Overrides:
visitin classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Field obj)
- Overrides:
visitin classBetterVisitor
-
visitAfter
public void visitAfter(org.apache.bcel.classfile.JavaClass obj)
- Overrides:
visitAfterin classPreorderVisitor
-
superClinitCall
private void superClinitCall()
-
handleStatus
private void handleStatus()
-
visit
public void visit(org.apache.bcel.classfile.Code obj)
- Overrides:
visitin classDismantleBytecode
-
sawOpcode
public void sawOpcode(int seen)
Description copied from class:OpcodeStackDetectorBy default, this method will not be called when stack is TOP. To change this behavior, override
#beforeOpcode(int)and change to return true even if stack is TOP.see Using FindBugs for Research to learn lattice and what TOP means.
- Specified by:
sawOpcodein classOpcodeStackDetector- See Also:
OpcodeStackDetector.beforeOpcode(int)
-
getMethodCall
private FindNoSideEffectMethods.MethodCall getMethodCall(MethodDescriptor methodDescriptorOperand)
-
sawCall
private void sawCall(FindNoSideEffectMethods.MethodCall methodCall, boolean finalPass)
-
sawNoSideEffectCall
private void sawNoSideEffectCall(MethodDescriptor methodDescriptor)
- Parameters:
methodDescriptor-
-
sawUnsureCall
private void sawUnsureCall(FindNoSideEffectMethods.MethodCall methodCall)
-
isNew
private static boolean isNew(OpcodeStack.Item item)
- Parameters:
item- stack item to check- Returns:
- true if this stack item is known to be newly created
-
changesOnlyNewObjects
private boolean changesOnlyNewObjects(MethodDescriptor methodDescriptor)
-
changedArg
private static int changedArg(MethodDescriptor m)
- Parameters:
m- method to check- Returns:
- array of argument numbers (0-based) which this method writes into or null if we don't know anything about this method
-
hasNoSideEffect
private static boolean hasNoSideEffect(MethodDescriptor m)
- Parameters:
m- method to check- Returns:
- true if given method is known to have no side effects
-
hasNoSideEffectUnknown
private static boolean hasNoSideEffectUnknown(MethodDescriptor m)
- Parameters:
m- method to check- Returns:
- true if we may assume that given unseen method has no side effect
-
isObjectOnlyMethod
private static boolean isObjectOnlyMethod(MethodDescriptor m)
- Parameters:
m- method to check- Returns:
- true if given method is known to change its object only
-
isObjectOnlyClass
private static boolean isObjectOnlyClass(java.lang.String className)
- Parameters:
className- class to check- Returns:
- true if all methods of this class are known to be object-only or no-side-effect
-
report
public void report()
Description copied from interface:DetectorThis method is called after all classes to be visited. It should be used by any detectors which accumulate information over all visited classes to generate results.- Specified by:
reportin interfaceDetector- Overrides:
reportin classBytecodeScanningDetector
-
hasOtherImplementations
private static boolean hasOtherImplementations(XMethod xMethod)
- Parameters:
xMethod-- Returns:
- true if this has other implementations
-
computeFinalStatus
private void computeFinalStatus()
-
-