Class AbstractCFG<I, T extends IBasicBlock<I>>
java.lang.Object
com.ibm.wala.cfg.AbstractCFG<I,T>
- All Implemented Interfaces:
ControlFlowGraph<I,T>, MinimalCFG<T>, Constants, EdgeManager<T>, Graph<T>, NodeManager<T>, NumberedEdgeManager<T>, NumberedGraph<T>, NumberedNodeManager<T>, Iterable<T>
- Direct Known Subclasses:
AstTranslator.AstCFG, DexCFG, InducedCFG, ShrikeCFG
public abstract class AbstractCFG<I, T extends IBasicBlock<I>>
extends Object
implements ControlFlowGraph<I,T>, MinimalCFG<T>, Constants
Common functionality for
ControlFlowGraph implementations.-
Field Summary
Fields inherited from interface Constants
ACC_ABSTRACT, ACC_ANNOTATION, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MODULE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_MethodRef, CONSTANT_MethodType, CONSTANT_NameAndType, CONSTANT_String, CONSTANT_Utf8, indexedTypes, indexedTypes_T, MAYBE, NO, OP_aaload, OP_aastore, OP_aconst_null, OP_aload, OP_aload_0, OP_aload_1, OP_aload_2, OP_aload_3, OP_anewarray, OP_areturn, OP_arraylength, OP_astore, OP_astore_0, OP_astore_1, OP_astore_2, OP_astore_3, OP_athrow, OP_baload, OP_bastore, OP_bipush, OP_caload, OP_castore, OP_checkcast, OP_d2f, OP_d2i, OP_d2l, OP_dadd, OP_daload, OP_dastore, OP_dcmpg, OP_dcmpl, OP_dconst_0, OP_dconst_1, OP_ddiv, OP_dload, OP_dload_0, OP_dload_1, OP_dload_2, OP_dload_3, OP_dmul, OP_dneg, OP_drem, OP_dreturn, OP_dstore, OP_dstore_0, OP_dstore_1, OP_dstore_2, OP_dstore_3, OP_dsub, OP_dup, OP_dup_x1, OP_dup_x2, OP_dup2, OP_dup2_x1, OP_dup2_x2, OP_f2d, OP_f2i, OP_f2l, OP_fadd, OP_faload, OP_fastore, OP_fcmpg, OP_fcmpl, OP_fconst_0, OP_fconst_1, OP_fconst_2, OP_fdiv, OP_fload, OP_fload_0, OP_fload_1, OP_fload_2, OP_fload_3, OP_fmul, OP_fneg, OP_frem, OP_freturn, OP_fstore, OP_fstore_0, OP_fstore_1, OP_fstore_2, OP_fstore_3, OP_fsub, OP_getfield, OP_getstatic, OP_goto, OP_goto_w, OP_i2b, OP_i2c, OP_i2d, OP_i2f, OP_i2l, OP_i2s, OP_iadd, OP_iaload, OP_iand, OP_iastore, OP_iconst_0, OP_iconst_1, OP_iconst_2, OP_iconst_3, OP_iconst_4, OP_iconst_5, OP_iconst_m1, OP_idiv, OP_if_acmpeq, OP_if_acmpne, OP_if_icmpeq, OP_if_icmpge, OP_if_icmpgt, OP_if_icmple, OP_if_icmplt, OP_if_icmpne, OP_ifeq, OP_ifge, OP_ifgt, OP_ifle, OP_iflt, OP_ifne, OP_ifnonnull, OP_ifnull, OP_iinc, OP_iload, OP_iload_0, OP_iload_1, OP_iload_2, OP_iload_3, OP_imul, OP_ineg, OP_instanceof, OP_invokedynamic, OP_invokeinterface, OP_invokespecial, OP_invokestatic, OP_invokevirtual, OP_ior, OP_irem, OP_ireturn, OP_ishl, OP_ishr, OP_istore, OP_istore_0, OP_istore_1, OP_istore_2, OP_istore_3, OP_isub, OP_iushr, OP_ixor, OP_jsr, OP_jsr_w, OP_l2d, OP_l2f, OP_l2i, OP_ladd, OP_laload, OP_land, OP_lastore, OP_lcmp, OP_lconst_0, OP_lconst_1, OP_ldc, OP_ldc_w, OP_ldc2_w, OP_ldiv, OP_lload, OP_lload_0, OP_lload_1, OP_lload_2, OP_lload_3, OP_lmul, OP_lneg, OP_lookupswitch, OP_lor, OP_lrem, OP_lreturn, OP_lshl, OP_lshr, OP_lstore, OP_lstore_0, OP_lstore_1, OP_lstore_2, OP_lstore_3, OP_lsub, OP_lushr, OP_lxor, OP_monitorenter, OP_monitorexit, OP_multianewarray, OP_new, OP_newarray, OP_nop, OP_pop, OP_pop2, OP_putfield, OP_putstatic, OP_ret, OP_return, OP_saload, OP_sastore, OP_sipush, OP_swap, OP_tableswitch, OP_wide, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TYPE_boolean, TYPE_boolean_index, TYPE_byte, TYPE_byte_index, TYPE_char, TYPE_char_index, TYPE_Class, TYPE_double, TYPE_double_index, TYPE_Error, TYPE_Exception, TYPE_float, TYPE_float_index, TYPE_int, TYPE_int_index, TYPE_long, TYPE_long_index, TYPE_MethodHandle, TYPE_MethodType, TYPE_null, TYPE_Object, TYPE_Object_index, TYPE_RuntimeException, TYPE_short, TYPE_short_index, TYPE_String, TYPE_Throwable, TYPE_unknown, TYPE_void, YES -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidvoidaddExceptionalEdge(T src, T dst) voidadd a node to this graphvoidaddNormalEdge(T src, T dst) booleancontainsNode(T N) entry()Return the entry basic block for the CFG.abstract booleanexit()Return the exit basic block for the CFG.Returns the catchBlocks.The order of blocks returned should be arbitrary but deterministic.The order of blocks returned must indicate the exception-handling scope.intgetNode(int number) The order of blocks returned should be arbitrary but deterministic.The order of blocks returned should be arbitrary but deterministic.intintintgetNumberOfExceptionalOut(int number) intintintintintReturn the number ofimmediate predecessornodes of ngetPredNodeNumbers(T node) getPredNodes(T N) Return anIteratorover the immediate predecessor nodes of nintReturn the number ofimmediate successornodes of this Node in the GraphgetSuccNodeNumbers(T node) getSuccNodes(T N) Return an Iterator over the immediate successor nodes of nbooleanbooleanhasExceptionalEdge(T src, T dst) abstract inthashCode()booleanhasNormalEdge(T src, T dst) protected voidinit()subclasses must call this before calling addEdge, but after creating the nodesbooleanisCatchBlock(int i) iterator()voidremoveAllIncidentEdges(T node) voidremoveEdge(T src, T dst) voidremoveIncomingEdges(T node) voidremoveNode(T n) remove a node from this graphvoidremove a node and all its incident edgesvoidremoveOutgoingEdges(T node) protected voidsetCatchBlock(int i) record that basic block i is a catch blockstream()toString()Methods inherited from interface ControlFlowGraph
getBlockForInstruction, getInstructions, getProgramCounterMethods inherited from interface Iterable
forEach, spliterator
-
Constructor Details
-
AbstractCFG
-
-
Method Details
-
init
protected void init()subclasses must call this before calling addEdge, but after creating the nodes -
equals
-
hashCode
-
entry
Return the entry basic block for the CFG.- Specified by:
entryin interfaceMinimalCFG<I>
-
exit
Return the exit basic block for the CFG.- Specified by:
exitin interfaceMinimalCFG<I>- Returns:
- the synthetic exit block for the cfg
-
getPredNodeCount
Description copied from interface:EdgeManagerReturn the number ofimmediate predecessornodes of n- Specified by:
getPredNodeCountin interfaceEdgeManager<I>- Returns:
- the number of immediate predecessors of n.
-
getNumberOfNormalIn
-
getNumberOfExceptionalIn
-
getNumberOfExceptionalOut
public int getNumberOfExceptionalOut(int number) - Parameters:
number- number of a basic block in this cfg
-
getNumberOfNormalOut
-
getNumberOfExceptionalOut
-
getPredNodes
Description copied from interface:EdgeManagerReturn anIteratorover the immediate predecessor nodes of nThis method never returns
null.- Specified by:
getPredNodesin interfaceEdgeManager<I>- Returns:
- an
Iteratorover the immediate predecessor nodes of this Node.
-
getSuccNodeCount
Description copied from interface:EdgeManagerReturn the number ofimmediate successornodes of this Node in the Graph- Specified by:
getSuccNodeCountin interfaceEdgeManager<I>- Returns:
- the number of immediate successor Nodes of this Node in the Graph.
-
getSuccNodes
Description copied from interface:EdgeManagerReturn an Iterator over the immediate successor nodes of nThis method never returns
null.- Specified by:
getSuccNodesin interfaceEdgeManager<I>- Returns:
- an Iterator over the immediate successor nodes of n
-
addNode
Description copied from interface:NodeManageradd a node to this graph- Specified by:
addNodein interfaceNodeManager<I>
-
getMaxNumber
public int getMaxNumber()- Specified by:
getMaxNumberin interfaceNumberedNodeManager<I>
-
getNode
- Specified by:
getNodein interfaceNumberedNodeManager<I>
-
getNumber
- Specified by:
getNumberin interfaceNumberedNodeManager<I>
-
getNumberOfNodes
public int getNumberOfNodes()- Specified by:
getNumberOfNodesin interfaceNodeManager<I>- Returns:
- the number of nodes in this graph
-
iterator
-
stream
-
addEdge
- Specified by:
addEdgein interfaceEdgeManager<I>- Throws:
UnimplementedError
-
removeEdge
- Specified by:
removeEdgein interfaceEdgeManager<I>- Throws:
UnsupportedOperationException
-
hasEdge
- Specified by:
hasEdgein interfaceEdgeManager<I>
-
hasExceptionalEdge
-
hasNormalEdge
-
addNormalEdge
- Throws:
IllegalArgumentException- if src or dst is null
-
addExceptionalEdge
- Throws:
IllegalArgumentException- if dst is null
-
removeNodeAndEdges
Description copied from interface:Graphremove a node and all its incident edges- Specified by:
removeNodeAndEdgesin interfaceGraph<I>- Throws:
UnimplementedError- See Also:
-
removeNode
Description copied from interface:NodeManagerremove a node from this graph- Specified by:
removeNodein interfaceNodeManager<I>- Throws:
UnimplementedError- See Also:
-
containsNode
- Specified by:
containsNodein interfaceNodeManager<I>- Returns:
- true iff the graph contains the specified node
- See Also:
-
toString
-
setCatchBlock
protected void setCatchBlock(int i) record that basic block i is a catch block -
isCatchBlock
public boolean isCatchBlock(int i) - Returns:
- true iff block i is a catch block
-
getCatchBlocks
Returns the catchBlocks.- Specified by:
getCatchBlocksin interfaceControlFlowGraph<I, T extends IBasicBlock<I>>- Returns:
- the indices of the catch blocks, as a bit vector
-
getMethod
- Specified by:
getMethodin interfaceControlFlowGraph<I, T extends IBasicBlock<I>>- Returns:
- the Method this CFG represents
-
removeAllIncidentEdges
- Specified by:
removeAllIncidentEdgesin interfaceEdgeManager<I>- Throws:
UnimplementedError- See Also:
-
getExceptionalSuccessors
Description copied from interface:MinimalCFGThe order of blocks returned must indicate the exception-handling scope. So the first block is the first candidate catch block, and so on. With this invariant one can compute the exceptional control flow for a given exception type.- Specified by:
getExceptionalSuccessorsin interfaceMinimalCFG<I>- Returns:
- the basic blocks which may be reached from b via exceptional control flow
-
getNormalSuccessors
Description copied from interface:MinimalCFGThe order of blocks returned should be arbitrary but deterministic.- Specified by:
getNormalSuccessorsin interfaceMinimalCFG<I>- Returns:
- the basic blocks which may be reached from b via normal control flow
-
iterateNodes
- Specified by:
iterateNodesin interfaceNumberedNodeManager<I>- Returns:
- iterator of nodes with the numbers in set s
- See Also:
-
removeIncomingEdges
- Specified by:
removeIncomingEdgesin interfaceEdgeManager<I>- Throws:
UnimplementedError
-
removeOutgoingEdges
- Specified by:
removeOutgoingEdgesin interfaceEdgeManager<I>- Throws:
UnimplementedError
-
getExceptionalToExit
-
getNormalToExit
-
getExceptionalPredecessors
Description copied from interface:MinimalCFGThe order of blocks returned should be arbitrary but deterministic.- Specified by:
getExceptionalPredecessorsin interfaceMinimalCFG<I>- Returns:
- the basic blocks from which b may be reached via exceptional control flow
-
getNormalPredecessors
Description copied from interface:MinimalCFGThe order of blocks returned should be arbitrary but deterministic.- Specified by:
getNormalPredecessorsin interfaceMinimalCFG<I>- Returns:
- the basic blocks from which b may be reached via normal control flow
-
getPredNodeNumbers
- Specified by:
getPredNodeNumbersin interfaceNumberedEdgeManager<I>- Returns:
- the numbers identifying the immediate predecessors of node
- Throws:
UnimplementedError
-
getSuccNodeNumbers
- Specified by:
getSuccNodeNumbersin interfaceNumberedEdgeManager<I>- Returns:
- the numbers identifying the immediate successors of node
-