| java.lang.Object | |
| ↳ | com.pnfsoftware.jeb.core.units.code.CFGUtil |
Utility code for IControlFlowGraph.
| Nested Classes | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| class | CFGUtil.BlockGroup | Given a start block A and an end block B, find the group of blocks G flowing from A to B, such that: 1) all blocks in G are reachable from A; 2) no blocks in G are reachable from B. | |||||||||
| class | CFGUtil.DotFileGenerator | GraphViz generator for CFG objects. | |||||||||
| class | CFGUtil.RegionFinder | This class attempts to determine a region in a graph. | |||||||||
| Public Constructors | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| CFGUtil() | |||||||||||
| Public Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| static boolean |
canReach(IBasicBlock<? extends IInstruction> from, IBasicBlock<? extends IInstruction> to)
Determine whether a regular path exists between a source block and a destination block.
| ||||||||||
| static boolean |
canReach(IBasicBlock<? extends IInstruction> from, IBasicBlock<? extends IInstruction> to, boolean alsoFollowIrregularFlow)
Determine whether a path exists between a source block and a destination block.
| ||||||||||
| static boolean |
canReach(IBasicBlock<? extends IInstruction> from, IBasicBlock<? extends IInstruction> to, boolean alsoFollowIrregularFlow, Collection<IBasicBlock<? extends IInstruction>> stopperBlocks)
Determine whether a path exists between a source block and a destination block.
| ||||||||||
| static int |
countDeepInputs(IBasicBlock<? extends IInstruction> b, int maxdepth)
Count regular the number of top-level input blocks leading to the provided block.
| ||||||||||
| static void |
toDot(IControlFlowGraph<?, ?> cfg, File file)
Build the CFG text representation using the dot language.
| ||||||||||
| static void |
toDot(IControlFlowGraph<?, ?> cfg, File file, String title, Map<Long, String> blockHeaders)
Build the CFG text representation using the dot language.
| ||||||||||
| static void |
toDot(IControlFlowGraph<?, ?> cfg, File file, String title)
Build the CFG text representation using the dot language.
| ||||||||||
| static void |
toDot(IControlFlowGraph<?, ?> cfg, File file, String title, Map<Long, String> blockHeaders, int lineLimit)
Build the CFG text representation using the dot language.
| ||||||||||
| static void | toTempDot(IControlFlowGraph<?, ?> cfg, String name, String title, Map<Long, String> blockHeaders, int lineLimit) | ||||||||||
| static void | toTempDot(IControlFlowGraph<?, ?> cfg, String name) | ||||||||||
| static void |
verify(IControlFlowGraph<?, ?> cfg)
Verification of a CFG.
| ||||||||||
| static void |
verify(IControlFlowGraph<?, ?> cfg, boolean checkConnected, boolean checkGapless, boolean checkFlowinfo, boolean checkNoDupEdges, boolean checkNoDupIrregularEdges)
Verification of a CFG.
| ||||||||||
|
[Expand]
Inherited Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
From class
java.lang.Object
| |||||||||||
Determine whether a regular path exists between a source block and a destination block. If both source and destination blocks are the same block B, the method returns true if B is part of a regular loop (i.e., a path exists from B to B). Exceptional flow (irregular edges) are disregarded.
| from | source block |
|---|---|
| to | destination block |
Determine whether a path exists between a source block and a destination block. If both source and destination blocks are the same block B, the method returns true if B is part of a loop (i.e., a path exists from B to B).
| from | source block |
|---|---|
| to | destination block |
| alsoFollowIrregularFlow | if true, irregular control flow will also be followed |
Determine whether a path exists between a source block and a destination block. If both source and destination blocks are the same block B, the method returns true if B is part of a loop (i.e., a path exists from B to B).
| from | source block |
|---|---|
| to | destination block |
| alsoFollowIrregularFlow | if true, irregular control flow will also be followed |
Count regular the number of top-level input blocks leading to the provided block.
| b | the basic block to be examined |
|---|---|
| maxdepth | if less or equal than 1, this method is equivalent to
insize() |
Build the CFG text representation using the dot language. To generate a PNG: dot
out.dot -Tpng -o out.png
| file | output file |
|---|
| IOException |
|---|
Build the CFG text representation using the dot language. To generate a PNG: dot
out.dot -Tpng -o out.png
| file | output file |
|---|---|
| title | optional graph title |
| blockHeaders | optional map of block headers (block_address -> block_description_string); if null, a standard header "(block_index)" is used |
| IOException |
|---|
Build the CFG text representation using the dot language. To generate a PNG: dot
out.dot -Tpng -o out.png
| file | output file |
|---|---|
| title | optional graph title |
| IOException |
|---|
Build the CFG text representation using the dot language. To generate a PNG: dot
out.dot -Tpng -o out.png
| IOException |
|---|
Verification of a CFG. Throws RuntimeException (or derived) on error.
Calls verify(IControlFlowGraph, boolean, boolean, boolean, boolean, boolean) with
all optional checks enabled.
| cfg | the CFG to be verified |
|---|
| RuntimeException | if the verification failed |
|---|
Verification of a CFG. Throws RuntimeException (or derived) on error.
This method checks the following:
- the graph is not empty
- no block is empty
- all blocks are reachable, either regularly or irregularly, from the entry node #0
Additional optional checks can be performed, see the parameters.
| cfg | the CFG to be verified |
|---|---|
| checkConnected | if true, the graph is verified to be connected, i.e. all blocks must be reachable from the entry block |
| checkGapless | if true, the graph cannot have gaps between basic blocks |
| checkFlowinfo | if true, consistency checks between
getBreakingFlow(long) and
getOutputBlocks() are performed |
| checkNoDupEdges | if true, verify that CFG input/output regular edges of basic blocks do not contain duplicates |
| checkNoDupIrregularEdges | if true, verify that CFG input/output irregular edges of basic blocks do not contain duplicates |
| RuntimeException | if the verification failed |
|---|