Class CFG

All Implemented Interfaces:
Debug, Graph<Edge,BasicBlock>

public class CFG extends AbstractGraph<Edge,BasicBlock> implements Debug
Simple control flow graph abstraction for BCEL.
See Also:
  • Field Details

    • PRUNED_INFEASIBLE_EXCEPTIONS

      public static final int PRUNED_INFEASIBLE_EXCEPTIONS
      Flag set if infeasible exception edges have been pruned from the CFG.
      See Also:
    • PRUNED_UNCONDITIONAL_THROWERS

      public static final int PRUNED_UNCONDITIONAL_THROWERS
      Flag set if normal return edges from calls to methods which unconditionally throw an exception have been removed.
      See Also:
    • REFINED

      public static final int REFINED
      Flag set if CFG has been "refined"; i.e., to the extent possible, all infeasible edges have been removed.
      See Also:
    • PRUNED_FAILED_ASSERTION_EDGES

      public static final int PRUNED_FAILED_ASSERTION_EDGES
      Flag set if CFG edges corresponding to failed assertions have been removed.
      See Also:
    • BUSY

      public static final int BUSY
      Flag set if CFG is busy (in the process of being refined.
      See Also:
    • FOUND_INEXACT_UNCONDITIONAL_THROWERS

      public static final int FOUND_INEXACT_UNCONDITIONAL_THROWERS
      See Also:
  • Constructor Details

    • CFG

      public CFG()
      Constructor. Creates empty control flow graph (with just entry and exit nodes).
  • Method Details

    • setMethodName

      public void setMethodName(String methodName)
      Parameters:
      methodName - The methodName to set.
    • setMethodGen

      public void setMethodGen(org.apache.bcel.generic.MethodGen methodGen)
    • getMethodGen

      public org.apache.bcel.generic.MethodGen getMethodGen()
    • getMethodName

      public String getMethodName()
      Returns:
      Returns the methodName.
    • getMethodSig

      public String getMethodSig()
    • setFlags

      public void setFlags(int flags)
    • setFlag

      public void setFlag(int flags)
    • clearFlag

      public void clearFlag(int flags)
    • getFlags

      public int getFlags()
    • isFlagSet

      public boolean isFlagSet(int flag)
    • getEntry

      public BasicBlock getEntry()
      Get the entry node.
    • getExit

      public BasicBlock getExit()
      Get the exit node.
    • createEdge

      public Edge createEdge(BasicBlock source, BasicBlock dest, @Type int type)
      Add a unique edge to the graph. There must be no other edge already in the CFG with the same source and destination blocks.
      Parameters:
      source - the source basic block
      dest - the destination basic block
      type - the type of edge; see constants in EdgeTypes interface
      Returns:
      the newly created Edge
      Throws:
      IllegalStateException - if there is already an edge in the CFG with the same source and destination block
    • lookupEdgeById

      public Edge lookupEdgeById(int id)
      Look up an Edge by its id.
      Parameters:
      id - the id of the edge to look up
      Returns:
      the Edge, or null if no matching Edge was found
    • lookupBlockByLabel

      public BasicBlock lookupBlockByLabel(int blockLabel)
      Look up a BasicBlock by its unique label.
      Parameters:
      blockLabel - the label of a BasicBlock
      Returns:
      the BasicBlock with the given label, or null if there is no such BasicBlock
    • blockIterator

      public Iterator<BasicBlock> blockIterator()
      Get an Iterator over the nodes (BasicBlocks) of the control flow graph.
    • blocks

      public Iterable<BasicBlock> blocks()
    • locationIterator

      public Iterator<Location> locationIterator()
      Get an Iterator over the Locations in the control flow graph.
    • locations

      public Iterable<Location> locations()
      Get an Iterator over the Locations in the control flow graph.
    • orderedLocations

      public Collection<Location> orderedLocations()
      Returns a collection of locations, ordered according to the compareTo ordering over locations. If you want to list all the locations in a CFG for debugging purposes, this is a good order to do so in.
      Returns:
      collection of locations
    • getBlocks

      public Collection<BasicBlock> getBlocks(BitSet labelSet)
      Get Collection of basic blocks whose IDs are specified by given BitSet.
      Parameters:
      labelSet - BitSet of block labels
      Returns:
      a Collection containing the blocks whose IDs are given
    • getBlocksContainingInstructionWithOffset

      public Collection<BasicBlock> getBlocksContainingInstructionWithOffset(int offset)
      Get a Collection of basic blocks which contain the bytecode instruction with given offset.
      Parameters:
      offset - the bytecode offset of an instruction
      Returns:
      Collection of BasicBlock objects which contain the instruction with that offset
    • getLocationsContainingInstructionWithOffset

      public Collection<Location> getLocationsContainingInstructionWithOffset(int offset)
      Get a Collection of Locations which specify the instruction at given bytecode offset.
      Parameters:
      offset - the bytecode offset
      Returns:
      all Locations referring to the instruction at that offset
    • getPredecessorWithEdgeType

      public BasicBlock getPredecessorWithEdgeType(BasicBlock target, @Type int edgeType)
      Get the first predecessor reachable from given edge type.
      Parameters:
      target - the target block
      edgeType - the edge type leading from the predecessor
      Returns:
      the predecessor, or null if there is no incoming edge with the specified edge type
    • getSuccessorWithEdgeType

      public BasicBlock getSuccessorWithEdgeType(BasicBlock source, @Type int edgeType)
      Get the first successor reachable from given edge type.
      Parameters:
      source - the source block
      edgeType - the edge type leading to the successor
      Returns:
      the successor, or null if there is no outgoing edge with the specified edge type
    • getExceptionThrowerLocation

      public Location getExceptionThrowerLocation(Edge exceptionEdge)
      Get the Location where exception(s) thrown on given exception edge are thrown.
      Parameters:
      exceptionEdge - the exception Edge
      Returns:
      Location where exception(s) are thrown from
    • removedEdgeIterator

      public Iterator<Edge> removedEdgeIterator()
      Get an Iterator over Edges removed from this CFG.
      Returns:
      Iterator over Edges removed from this CFG
    • getIncomingEdgeWithType

      public Edge getIncomingEdgeWithType(BasicBlock basicBlock, @Type int edgeType)
      Get the first incoming edge in basic block with given type.
      Parameters:
      basicBlock - the basic block
      edgeType - the edge type
      Returns:
      the Edge, or null if there is no edge with that edge type
    • getOutgoingEdgeWithType

      public Edge getOutgoingEdgeWithType(BasicBlock basicBlock, @Type int edgeType)
      Get the first outgoing edge in basic block with given type.
      Parameters:
      basicBlock - the basic block
      edgeType - the edge type
      Returns:
      the Edge, or null if there is no edge with that edge type
    • allocate

      public BasicBlock allocate()
      Allocate a new BasicBlock. The block won't be connected to any node in the graph.
    • getNumBasicBlocks

      public int getNumBasicBlocks()
      Get number of basic blocks. This is just here for compatibility with the old CFG method names.
    • getMaxEdgeId

      public int getMaxEdgeId()
      Get the number of edge labels allocated. This is just here for compatibility with the old CFG method names.
    • checkIntegrity

      public void checkIntegrity()
    • allocateEdge

      protected Edge allocateEdge(BasicBlock source, BasicBlock target)
      Specified by:
      allocateEdge in class AbstractGraph<Edge,BasicBlock>
    • removeEdge

      public void removeEdge(Edge edge)
      Description copied from interface: Graph
      Remove given edge from the graph.
      Specified by:
      removeEdge in interface Graph<Edge,BasicBlock>
      Overrides:
      removeEdge in class AbstractGraph<Edge,BasicBlock>
    • getNumNonExceptionSucessors

      public int getNumNonExceptionSucessors(BasicBlock block)
      Get number of non-exception control successors of given basic block.
      Parameters:
      block - a BasicBlock
      Returns:
      number of non-exception control successors of the basic block
    • getLocationAtEntry

      public Location getLocationAtEntry()
      Get the Location representing the entry to the CFG. Note that this is a "fake" Location, and shouldn't be relied on to yield source line information.
      Returns:
      Location at entry to CFG
    • getPreviousLocation

      public Location getPreviousLocation(Location loc)