Class FindNoSideEffectMethods
- All Implemented Interfaces:
Detector, FirstPassDetector, NonReportingDetector, Priorities, org.apache.bcel.classfile.Visitor
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static classprivate static classstatic enumPublic status of the method in NSE database TODO: implement CHECKstatic classprivate static enumNested classes/interfaces inherited from class OpcodeStackDetector
OpcodeStackDetector.WithCustomJumpInfo -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate Set<FieldDescriptor> private static final MethodDescriptorprivate static final MethodDescriptorprivate final Map<MethodDescriptor, List<FindNoSideEffectMethods.MethodCall>> private static final MethodDescriptorprivate booleanprivate booleanprivate static final MethodDescriptorprivate Set<MethodDescriptor> private static final MethodDescriptorprivate final Set<MethodDescriptor> private static final MethodDescriptorprivate static final Set<MethodDescriptor> private static final Set<MethodDescriptor> Known methods which have no side-effectprivate final FindNoSideEffectMethods.NoSideEffectMethodsDatabaseprivate 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 FieldDescriptorprivate static final FieldDescriptorprivate static final FieldDescriptorprivate booleanprivate final Set<MethodDescriptor> Fields inherited from class OpcodeStackDetector
stackFields inherited from class DismantleBytecode
codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINTFields inherited from interface Priorities
EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate static intprivate booleanchangesOnlyNewObjects(MethodDescriptor methodDescriptor) private voidgetMethodCall(MethodDescriptor methodDescriptorOperand) private voidprivate static booleanprivate static booleanprivate static booleanhasOtherImplementations(XMethod xMethod) private static booleanisNew(OpcodeStack.Item item) private static booleanisObjectOnlyClass(String className) private static booleanvoidreport()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 voidvoidvisit(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 OpcodeStackDetector
afterOpcode, beforeOpcode, getStack, isUsingCustomUserValue, visitCodeMethods inherited from class BytecodeScanningDetector
getClassContext, shouldVisitCode, visitClassContextMethods inherited from class 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, sawStringMethods inherited from class AnnotationVisitor
getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotationMethods inherited from class 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, visitStackMapEntryMethods inherited from class 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, visitUnknownMethods inherited from class Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods 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:
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:
-
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: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
- Parameters:
xMethod-- Returns:
- true if this has other implementations
-
computeFinalStatus
private void computeFinalStatus()
-