控制流图
控制流图(Control Flow Graph, CFG)也叫控制流程图,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向, 也能反映一个过程的实时执行过程。
Frances E. Allen于1970年提出控制流图的概念1。此后,控制流图成为了编译器优化和静态分析的重要工具。
基本信息
- 中文名
控制流图
- 外文名
Control flow graph
- 简称
CFG
- 又称
控制流程图
- 性质
一种可视化程序设计工具
细述
控制流图中每个在图形中的节点代表一个基本块,例如,没有任何跳跃或跳跃目标的直线代码块;跳跃目标以一个块开始,和以一个块结束。定向边缘被用于代表在控制流中的跳跃。在那里,在大部分介绍中,两个特定的设计块:项目块,通过它控制到流图的输入,和编辑块,通过它全面控制流输出。
意义
CFG 能反映出一个过程的许多信息:
是哪一个过程;
一个过程的入口(第一个基本块) 和出口( 最后一个基本块);
一个基本块的所有可能的下一个基本块( 所有的出口);
一个基本块的所有可能的上一个基本块( 所有的入口);
一个基本块所对应的语句表。
对于一个动态CFG 而言, 它还包含下列信息:
当前活动的基本块;
上次执行的基本块;
执行流向,即上次执行的基本块到当前活动基本块之间的连线。
功能
一个CFG 可显示一个过程内各基本块之间的相互关系、动态执行状态、各基本块对应的语句表。此外,还有其他辅助信息,如各基本块执行次数,执行时间等等。
静态结构图
静态结构图为一有向图,如图1右图所示。图中各节点的序号顺序从1排列。第1个块即为子程序头“Suborutine子程序名”。从一个节点到下一个节点的连线表明其执行的可能顺序,用有箭头的线表示,称为有向线。有向线的起点所对应的块为正要转移的块,而箭头所指的块为将要转向的块。
图1左图为一过程XYZA的源程序,图1右图为与该过程对应的CFG。从图1右图中可以看出,从一个节点画出的有向线有四种情形:(a)指向下一块;(b)指向下一块以后的节点;(c)指向上一个块或上一块以前的块;(d)指向其自身。如图1右图中, 块2到块3为(a)情形,块6到块8为(b)情形,块13到块6为(c) 情形,块12为(d)情形。
每一个块的块号为其标识符。每一块对应一组源程序中的语句。