Package edu.umd.cs.findbugs.detect
Class FindNoSideEffectMethods
- All Implemented Interfaces:
Detector
,FirstPassDetector
,NonReportingDetector
,Priorities
,org.apache.bcel.classfile.Visitor
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static class
private static class
static enum
Public status of the method in NSE database TODO: implement CHECKstatic class
private static enum
Nested classes/interfaces inherited from class edu.umd.cs.findbugs.bcel.OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate Set
<FieldDescriptor> private static final MethodDescriptor
private static final MethodDescriptor
private final Map
<MethodDescriptor, List<FindNoSideEffectMethods.MethodCall>> private static final MethodDescriptor
private boolean
private boolean
private static final MethodDescriptor
private Set
<MethodDescriptor> private static final MethodDescriptor
private final Set
<MethodDescriptor> private static final MethodDescriptor
private static final Set
<MethodDescriptor> private static final Set
<MethodDescriptor> Known methods which have no side-effectprivate final FindNoSideEffectMethods.NoSideEffectMethodsDatabase
private static final Set
<MethodDescriptor> Known methods which change only this objectprivate final Map
<MethodDescriptor, FindNoSideEffectMethods.SideEffectStatus> private static final byte[][]
private Set
<ClassDescriptor> private static final FieldDescriptor
private static final FieldDescriptor
private static final FieldDescriptor
private boolean
private final Set
<MethodDescriptor> 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 -
Method Summary
Modifier and TypeMethodDescriptionprivate static int
private boolean
changesOnlyNewObjects
(MethodDescriptor methodDescriptor) private void
getMethodCall
(MethodDescriptor methodDescriptorOperand) private void
private static boolean
private static boolean
private static boolean
hasOtherImplementations
(XMethod xMethod) private static boolean
isNew
(OpcodeStack.Item item) private static boolean
isObjectOnlyClass
(String className) private static boolean
void
report()
This method is called after all classes to be visited.private void
sawCall
(FindNoSideEffectMethods.MethodCall methodCall, boolean finalPass) private void
sawNoSideEffectCall
(MethodDescriptor methodDescriptor) void
sawOpcode
(int seen) By default, this method will not be called when stack is TOP.private void
sawUnsureCall
(FindNoSideEffectMethods.MethodCall methodCall) private void
void
visit
(org.apache.bcel.classfile.Code obj) void
visit
(org.apache.bcel.classfile.Field obj) void
visit
(org.apache.bcel.classfile.JavaClass obj) void
visit
(org.apache.bcel.classfile.Method method) void
visitAfter
(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
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 Details
-
GET_CLASS
-
ARRAY_COPY
-
HASH_CODE
-
CLASS_GET_NAME
-
ARRAY_STORE_STUB_METHOD
-
FIELD_STORE_STUB_METHOD
-
TARGET_THIS
-
TARGET_NEW
-
TARGET_OTHER
-
NUMBER_CLASSES
-
ALLOWED_EXCEPTIONS
-
NO_SIDE_EFFECT_COLLECTION_METHODS
-
OBJECT_ONLY_CLASSES
-
STUB_METHODS
private static final byte[][] STUB_METHODS -
OBJECT_ONLY_METHODS
Known methods which change only this object -
NO_SIDE_EFFECT_METHODS
Known methods which have no side-effect -
NEW_OBJECT_RETURNING_METHODS
-
statusMap
-
callGraph
-
getStaticMethods
-
uselessVoidCandidates
-
status
-
calledMethods
-
subtypes
-
finallyTargets
-
finallyExceptionRegisters
-
constructor
private boolean constructor -
uselessVoidCandidate
private boolean uselessVoidCandidate -
classInit
private boolean classInit -
allowedFields
-
fieldsModifyingMethods
-
noSideEffectMethods
-
-
Constructor Details
-
FindNoSideEffectMethods
-
-
Method Details
-
visit
public void visit(org.apache.bcel.classfile.JavaClass obj) - Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Method method) - Overrides:
visit
in classBetterVisitor
-
visit
public void visit(org.apache.bcel.classfile.Field obj) - Overrides:
visit
in classBetterVisitor
-
visitAfter
public void visitAfter(org.apache.bcel.classfile.JavaClass obj) - Overrides:
visitAfter
in classPreorderVisitor
-
superClinitCall
private void superClinitCall() -
handleStatus
private void handleStatus() -
visit
public void visit(org.apache.bcel.classfile.Code obj) - Overrides:
visit
in classDismantleBytecode
-
sawOpcode
public void sawOpcode(int seen) Description copied from class:OpcodeStackDetector
By 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:
sawOpcode
in classOpcodeStackDetector
- See Also:
-
getMethodCall
-
sawCall
-
sawNoSideEffectCall
- Parameters:
methodDescriptor
-
-
sawUnsureCall
-
isNew
- Parameters:
item
- stack item to check- Returns:
- true if this stack item is known to be newly created
-
changesOnlyNewObjects
-
changedArg
- 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
- Parameters:
m
- method to check- Returns:
- true if given method is known to have no side effects
-
hasNoSideEffectUnknown
- Parameters:
m
- method to check- Returns:
- true if we may assume that given unseen method has no side effect
-
isObjectOnlyMethod
- Parameters:
m
- method to check- Returns:
- true if given method is known to change its object only
-
isObjectOnlyClass
- 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:Detector
This 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:
report
in interfaceDetector
- Overrides:
report
in classBytecodeScanningDetector
-
hasOtherImplementations
- Parameters:
xMethod
-- Returns:
- true if this has other implementations
-
computeFinalStatus
private void computeFinalStatus()
-