Package edu.umd.cs.findbugs
Class OpcodeStack
- java.lang.Object
-
- edu.umd.cs.findbugs.OpcodeStack
-
public class OpcodeStack extends java.lang.Objecttracks the types and numbers of objects that are currently on the operand stack throughout the execution of method. To use, a detector should instantiate one for each method, and callstack.sawOpcode(this,seen);
at the bottom of their sawOpcode method. at any point you can then inspect the stack and see what the types of objects are on the stack, including constant values if they were pushed. The types described are of course, only the static types. There are some outstanding opcodes that have yet to be implemented, I couldn't find any code that actually generated these, so i didn't put them in because I couldn't test them:- dup2_x2
- jsr_w
- wide
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceOpcodeStack.CustomUserValueYou can put this annotation on a OpcodeStack detector to indicate that it usesOpcodeStack.Item.userValue, and thus should not reuse generic OpcodeStack information from an iterative evaluation of the opcode stack.(package private) static classOpcodeStack.HttpParameterInjectionstatic classOpcodeStack.Itemstatic classOpcodeStack.JumpInfostatic classOpcodeStack.JumpInfoFactory
-
Field Summary
Fields Modifier and Type Field Description (package private) booleanbackwardsBranch(package private) static java.util.HashMap<java.lang.String,java.lang.String>boxedTypes(package private) intconvertJumpToOneZeroState(package private) intconvertJumpToZeroOneStateprivate static booleanDEBUGprivate static booleanDEBUG2(package private) booleanencountedTop(package private) java.util.BitSetexceptionHandlersprivate java.lang.StringfullyQualifiedMethodNameprivate static java.util.Map<org.apache.commons.lang3.tuple.Pair<java.lang.String,java.lang.String>,java.lang.String>IMMUTABLE_RETURNER_MAPprivate static java.lang.StringJAVA_UTIL_ARRAYS_ARRAY_LISTprivate static java.lang.StringJAVA_UTIL_COLLECTIONSprivate java.util.Map<java.lang.Integer,java.util.List<OpcodeStack.Item>>jumpEntriesprivate java.util.BitSetjumpEntryLocationsprivate booleanjumpInfoChangedByBackwardsBranchprivate booleanjumpInfoChangedByNewTargetprivate java.util.Map<java.lang.Integer,java.util.List<OpcodeStack.Item>>jumpStackEntriesprivate java.util.List<java.lang.Integer>lastUpdateprivate java.util.List<OpcodeStack.Item>lvValuesprivate java.lang.StringmethodName(package private) booleanneedToMerge(package private) booleanoneMeansNullprivate booleanreachOnlyByBranch(package private) intregisterTestedFoundToBeNonnegativeprivate booleanseenTransferOfControlprivate java.util.List<OpcodeStack.Item>stackprivate booleantopprivate booleanuseIterativeAnalysis(package private) DismantleBytecodev(package private) intzeroOneComing
-
Constructor Summary
Constructors Constructor Description OpcodeStack()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static voidaddBoxedType(java.lang.Class<?>... clss)private voidaddJumpValue(int from, int target)voidclear()(package private) voidclearJumpInfoChangedByBackwardsBranch()(package private) voidclearJumpInfoChangedByNewTarget()private static voidclearRegisterLoad(java.util.List<OpcodeStack.Item> list, int register)private doubleconstantToDouble(OpcodeStack.Item it)private floatconstantToFloat(OpcodeStack.Item it)private intconstantToInt(OpcodeStack.Item it)private longconstantToLong(OpcodeStack.Item it)private voideraseKnowledgeOf(XField fieldOperand)private org.apache.bcel.classfile.BootstrapMethodgetBootstrapMethod(org.apache.bcel.classfile.Attribute[] attribs, org.apache.bcel.classfile.Constant index)static java.lang.StringgetExceptionSig(DismantleBytecode dbc, org.apache.bcel.classfile.CodeException e)OpcodeStack.ItemgetItemMethodInvokedOn(DismantleBytecode dbc)private OpcodeStack.JumpInfogetJumpInfo()private StackMapAnalyzer.JumpInfoFromStackMapgetJumpInfoFromStackMap()intgetLastUpdate(int reg)OpcodeStack.ItemgetLVValue(int index)intgetNumLastUpdates()intgetNumLocalValues()intgetStackDepth()OpcodeStack.ItemgetStackItem(int stackOffset)private java.lang.StringgetStringFromIndex(DismantleBytecode dbc, int i)private voidhandleDcmp(int opcode)private voidhandleDup()private voidhandleDup2()private voidhandleDup2X1()private voidhandleDup2X2()private voidhandleDupX1()private voidhandleDupX2()private voidhandleFcmp(int opcode)private voidhandleLcmp()private voidhandleSwap()booleanhasIncomingBranches(int pc)voidinitialize()(package private) booleanisJumpInfoChangedByBackwardsBranch()protected booleanisJumpInfoChangedByNewTarget()booleanisJumpTarget(int pc)private booleanisMethodThatReturnsGivenReference(java.lang.String clsName, java.lang.String methodName)(package private) booleanisReachOnlyByBranch()booleanisTop()voidlearnFrom(OpcodeStack.JumpInfo info)private voidmarkConstantValueUnknown(OpcodeStack.Item item)voidmergeJumps(DismantleBytecode dbc)private booleanmergeLists(java.util.List<OpcodeStack.Item> mergeInto, java.util.List<OpcodeStack.Item> mergeFrom, boolean errorIfSizesDoNotMatch)(package private) intnullSafeSize(java.util.Collection<?> c)private OpcodeStack.Itempop()private voidpop(int count)voidprecomputation(DismantleBytecode dbc)voidprintJumpEntries()private voidprocessInvokeDynamic(DismantleBytecode dbc)private voidprocessMethodCall(DismantleBytecode dbc, int seen)private voidpush(OpcodeStack.Item i)private voidpushByConstant(DismantleBytecode dbc, org.apache.bcel.classfile.Constant c)private voidpushByDoubleMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)private voidpushByFloatMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)private voidpushByIntMath(DismantleBytecode dbc, int seen, OpcodeStack.Item lhs, OpcodeStack.Item rhs)private voidpushByInvoke(DismantleBytecode dbc, boolean popThis)private voidpushByLocalLoad(java.lang.String signature, int register)private voidpushByLocalObjectLoad(DismantleBytecode dbc, int register)private voidpushByLocalStore(int register)private voidpushByLongMath(int seen, OpcodeStack.Item lhs, OpcodeStack.Item rhs)private voidpushBySignature(java.lang.String s, DismantleBytecode dbc)voidreplace(int stackOffset, OpcodeStack.Item value)voidreplaceTop(OpcodeStack.Item newTop)intresetForMethodEntry(DismantleBytecode visitor)private intresetForMethodEntry0(PreorderVisitor visitor)(package private) intresetForMethodEntry0(java.lang.String className, org.apache.bcel.classfile.Method m)voidsawOpcode(DismantleBytecode dbc, int seen)voidsetJumpInfoChangedByBackwardBranch(java.lang.String kind, int from, int to)(package private) voidsetJumpInfoChangedByBackwardsBranch(int from, int to)protected voidsetJumpInfoChangedByNewTarget()private voidsetLastUpdate(int reg, int pc)private voidsetLVValue(int index, OpcodeStack.Item value)(package private) voidsetReachOnlyByBranch(boolean reachOnlyByBranch)private voidsetTop(boolean top)private OpcodeStack.Itemtop()java.lang.StringtoString()
-
-
-
Field Detail
-
JAVA_UTIL_ARRAYS_ARRAY_LIST
private static final java.lang.String JAVA_UTIL_ARRAYS_ARRAY_LIST
- See Also:
- Constant Field Values
-
JAVA_UTIL_COLLECTIONS
private static final java.lang.String JAVA_UTIL_COLLECTIONS
- See Also:
- Constant Field Values
-
DEBUG
private static final boolean DEBUG
-
DEBUG2
private static final boolean DEBUG2
-
IMMUTABLE_RETURNER_MAP
private static final java.util.Map<org.apache.commons.lang3.tuple.Pair<java.lang.String,java.lang.String>,java.lang.String> IMMUTABLE_RETURNER_MAP
-
boxedTypes
@StaticConstant static final java.util.HashMap<java.lang.String,java.lang.String> boxedTypes
-
stack
private java.util.List<OpcodeStack.Item> stack
-
lvValues
private java.util.List<OpcodeStack.Item> lvValues
-
lastUpdate
private final java.util.List<java.lang.Integer> lastUpdate
-
top
private boolean top
-
seenTransferOfControl
private boolean seenTransferOfControl
-
useIterativeAnalysis
private final boolean useIterativeAnalysis
-
encountedTop
boolean encountedTop
-
backwardsBranch
boolean backwardsBranch
-
exceptionHandlers
java.util.BitSet exceptionHandlers
-
jumpInfoChangedByBackwardsBranch
private boolean jumpInfoChangedByBackwardsBranch
-
jumpInfoChangedByNewTarget
private boolean jumpInfoChangedByNewTarget
-
jumpEntries
private java.util.Map<java.lang.Integer,java.util.List<OpcodeStack.Item>> jumpEntries
-
jumpStackEntries
private java.util.Map<java.lang.Integer,java.util.List<OpcodeStack.Item>> jumpStackEntries
-
jumpEntryLocations
private java.util.BitSet jumpEntryLocations
-
convertJumpToOneZeroState
int convertJumpToOneZeroState
-
convertJumpToZeroOneState
int convertJumpToZeroOneState
-
registerTestedFoundToBeNonnegative
int registerTestedFoundToBeNonnegative
-
zeroOneComing
int zeroOneComing
-
oneMeansNull
boolean oneMeansNull
-
needToMerge
boolean needToMerge
-
reachOnlyByBranch
private boolean reachOnlyByBranch
-
methodName
private java.lang.String methodName
-
fullyQualifiedMethodName
private java.lang.String fullyQualifiedMethodName
-
-
Method Detail
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
hasIncomingBranches
public boolean hasIncomingBranches(int pc)
-
getExceptionSig
public static java.lang.String getExceptionSig(DismantleBytecode dbc, org.apache.bcel.classfile.CodeException e)
-
mergeJumps
public void mergeJumps(DismantleBytecode dbc)
-
setLastUpdate
private void setLastUpdate(int reg, int pc)
-
getLastUpdate
public int getLastUpdate(int reg)
-
getNumLastUpdates
public int getNumLastUpdates()
-
sawOpcode
public void sawOpcode(DismantleBytecode dbc, int seen)
-
eraseKnowledgeOf
private void eraseKnowledgeOf(XField fieldOperand)
-
precomputation
public void precomputation(DismantleBytecode dbc)
-
constantToInt
private int constantToInt(OpcodeStack.Item it)
-
constantToFloat
private float constantToFloat(OpcodeStack.Item it)
-
constantToDouble
private double constantToDouble(OpcodeStack.Item it)
-
constantToLong
private long constantToLong(OpcodeStack.Item it)
-
handleDcmp
private void handleDcmp(int opcode)
-
handleFcmp
private void handleFcmp(int opcode)
-
handleLcmp
private void handleLcmp()
-
handleSwap
private void handleSwap()
-
handleDup
private void handleDup()
-
handleDupX1
private void handleDupX1()
-
handleDup2
private void handleDup2()
-
handleDup2X1
private void handleDup2X1()
-
handleDup2X2
private void handleDup2X2()
-
handleDupX2
private void handleDupX2()
-
addBoxedType
private static void addBoxedType(java.lang.Class<?>... clss)
-
markConstantValueUnknown
private void markConstantValueUnknown(OpcodeStack.Item item)
-
processMethodCall
private void processMethodCall(DismantleBytecode dbc, int seen)
-
isMethodThatReturnsGivenReference
private boolean isMethodThatReturnsGivenReference(java.lang.String clsName, java.lang.String methodName)
-
processInvokeDynamic
private void processInvokeDynamic(DismantleBytecode dbc)
-
getBootstrapMethod
private org.apache.bcel.classfile.BootstrapMethod getBootstrapMethod(org.apache.bcel.classfile.Attribute[] attribs, org.apache.bcel.classfile.Constant index)
-
mergeLists
private boolean mergeLists(java.util.List<OpcodeStack.Item> mergeInto, java.util.List<OpcodeStack.Item> mergeFrom, boolean errorIfSizesDoNotMatch)
-
clear
public void clear()
-
printJumpEntries
public void printJumpEntries()
-
isJumpTarget
public boolean isJumpTarget(int pc)
-
addJumpValue
private void addJumpValue(int from, int target)
-
learnFrom
public void learnFrom(OpcodeStack.JumpInfo info)
-
initialize
public void initialize()
-
resetForMethodEntry
public int resetForMethodEntry(DismantleBytecode visitor)
-
nullSafeSize
int nullSafeSize(@CheckForNull java.util.Collection<?> c)
-
getJumpInfo
private OpcodeStack.JumpInfo getJumpInfo()
-
getJumpInfoFromStackMap
private StackMapAnalyzer.JumpInfoFromStackMap getJumpInfoFromStackMap()
-
setJumpInfoChangedByBackwardBranch
public void setJumpInfoChangedByBackwardBranch(java.lang.String kind, int from, int to)
-
resetForMethodEntry0
private int resetForMethodEntry0(PreorderVisitor visitor)
-
resetForMethodEntry0
int resetForMethodEntry0(@SlashedClassName java.lang.String className, org.apache.bcel.classfile.Method m)
-
getStackDepth
public int getStackDepth()
-
getStackItem
public OpcodeStack.Item getStackItem(int stackOffset)
-
pop
private OpcodeStack.Item pop()
-
top
private OpcodeStack.Item top()
-
replace
public void replace(int stackOffset, OpcodeStack.Item value)
-
replaceTop
public void replaceTop(OpcodeStack.Item newTop)
-
pop
private void pop(int count)
-
push
private void push(OpcodeStack.Item i)
-
pushByConstant
private void pushByConstant(DismantleBytecode dbc, org.apache.bcel.classfile.Constant c)
-
pushByLocalObjectLoad
private void pushByLocalObjectLoad(DismantleBytecode dbc, int register)
-
pushByIntMath
private void pushByIntMath(DismantleBytecode dbc, int seen, OpcodeStack.Item lhs, OpcodeStack.Item rhs)
-
pushByLongMath
private void pushByLongMath(int seen, OpcodeStack.Item lhs, OpcodeStack.Item rhs)
-
pushByFloatMath
private void pushByFloatMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
-
pushByDoubleMath
private void pushByDoubleMath(int seen, OpcodeStack.Item it, OpcodeStack.Item it2)
-
pushByInvoke
private void pushByInvoke(DismantleBytecode dbc, boolean popThis)
-
getItemMethodInvokedOn
public OpcodeStack.Item getItemMethodInvokedOn(DismantleBytecode dbc)
-
getStringFromIndex
private java.lang.String getStringFromIndex(DismantleBytecode dbc, int i)
-
pushBySignature
private void pushBySignature(java.lang.String s, DismantleBytecode dbc)
-
pushByLocalStore
private void pushByLocalStore(int register)
-
clearRegisterLoad
private static void clearRegisterLoad(java.util.List<OpcodeStack.Item> list, int register)
-
pushByLocalLoad
private void pushByLocalLoad(java.lang.String signature, int register)
-
setLVValue
private void setLVValue(int index, OpcodeStack.Item value)
-
getLVValue
@Nonnull public OpcodeStack.Item getLVValue(int index)
-
getNumLocalValues
public int getNumLocalValues()
-
setTop
private void setTop(boolean top)
-
isTop
public boolean isTop()
-
setReachOnlyByBranch
void setReachOnlyByBranch(boolean reachOnlyByBranch)
-
isReachOnlyByBranch
boolean isReachOnlyByBranch()
-
isJumpInfoChangedByBackwardsBranch
boolean isJumpInfoChangedByBackwardsBranch()
-
clearJumpInfoChangedByBackwardsBranch
void clearJumpInfoChangedByBackwardsBranch()
-
setJumpInfoChangedByBackwardsBranch
void setJumpInfoChangedByBackwardsBranch(int from, int to)
-
isJumpInfoChangedByNewTarget
protected boolean isJumpInfoChangedByNewTarget()
- Returns:
- Returns the jumpInfoChangedByNewTarget.
-
clearJumpInfoChangedByNewTarget
void clearJumpInfoChangedByNewTarget()
-
setJumpInfoChangedByNewTarget
protected void setJumpInfoChangedByNewTarget()
-
-