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 class
FindNoSideEffectMethods.EarlyExitException
private static class
FindNoSideEffectMethods.MethodCall
static class
FindNoSideEffectMethods.MethodSideEffectStatus
Public status of the method in NSE database TODO: implement CHECKstatic class
FindNoSideEffectMethods.NoSideEffectMethodsDatabase
private static class
FindNoSideEffectMethods.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 int
changedArg(MethodDescriptor m)
private boolean
changesOnlyNewObjects(MethodDescriptor methodDescriptor)
private void
computeFinalStatus()
private FindNoSideEffectMethods.MethodCall
getMethodCall(MethodDescriptor methodDescriptorOperand)
private void
handleStatus()
private static boolean
hasNoSideEffect(MethodDescriptor m)
private static boolean
hasNoSideEffectUnknown(MethodDescriptor m)
private static boolean
hasOtherImplementations(XMethod xMethod)
private static boolean
isNew(OpcodeStack.Item item)
private static boolean
isObjectOnlyClass(java.lang.String className)
private static boolean
isObjectOnlyMethod(MethodDescriptor m)
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
superClinitCall()
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
-
-
-
-
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:
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:
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: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
private static boolean hasOtherImplementations(XMethod xMethod)
- Parameters:
xMethod
-- Returns:
- true if this has other implementations
-
computeFinalStatus
private void computeFinalStatus()
-
-