控制流分析(Control flow analysis)简称CFA,是一种确认程式控制流程的静态代码分析技术。控制流程会以控制流图来表示。对于函数编程语言及面向对象程式设计,CFA都是指计算控制流程的算法。控制流分析一词最早是由Neil D. Jones及Olin Shivers开始使用。抽象释义、约束补偿及型别系统都可以用来进行控制流分析。
简介程序代码的静态分析就是通过检查程序的源代码来推测程序运行时的行为信息。静态分析出了能够检查指定程序中存在的错误和安全漏洞以外,同时还能够将其思想加入到代码编译器中,用于程序的优化。那么以何种方式才能够将静态分析用于优化,最关键的技术点就是流分析技术。流分析技术是比较传统的编译器优化技术,流分析能够保证程序内容真实性的状态下,确定一个指定程序节点的相对路径的事实。 流分析技术从大体上分类,分为控制流分析和数据流分析。
控制流分析是一类用于分析程序控制流结构的静态分析技术,目的在于生成程序的控制流图,在编译器设计、程序分析、程序理解等领域都有重要应用。对程序的控制流分析是对源程序或者源程序的中间表示形式的直接操作,形成控制流图;数据流分析是在控制流分析后得出的控制流图的基础上,将程序中的包含数据的变量沿着控制流图的路径,进行赋值和传递,直至程序完成,变量回收或者未被回收。那么从逻辑关系而言,控制流分析是先于数据流分析的,控制流分析对数据流分析有着先导性和支持性的作用。
类别控制流分析在从程序的特点上说明,可以将其看作两个大类:过程内的控制流分析和过程间的控制流分析。过程内的控制流分析可以简单的理解为是对一个函数内部的程序执行流程的分析,而过程间的控制流分析一般情况下指的是函数的调用关系的分析。从控制流分析的特点上看,主要的分析还是基于过程内的控制流分析,针对过程内的控制流分析,有两种主要的方法:一种方法是利用某些程序执行过程中的必经点,查找程序中的环,根据程序优化的需求,对这些环增加特定的注释,这种方法最理想的使用是迭代数据流优化器;另一种方法是区间分析,这里定义的区间包含了子程序整体结构的分析和嵌套区域的分析,由分析可以对源程序进行控制树的构造,控制数即在源程序的基础上将程序按照执行的逻辑顺序,构造一颗与源程序对应的树形数据结构,控制树可以在数据流分析阶段发挥关键的作用,当然,不是所有的控制流分析都是简单的,较为复杂的控制流分析是基于复杂区间的结构分析,这样的分析可以分析出子程序块中所有的控制流结构。但无论上述哪种方法的控制流分析,都需要先确定子程序的基本块,再根据基本块,进行程序控制流图的构造1。
静态分析对于程序的静态分析,指的是在代码不运行的方式下,对程序的源代码通过词法分析、语法分析以及针对程序执行逻辑的控制流的分析,来预测代码执行的结果,以判断执行结果是否满足安全性、可靠性的用户需求。因此,针对静态分析的执行特点,需要用户提供需要分析的目标源代码,而且静态分析往往需要结合人为的干预。 通常,静态分析具有以下几个特点:不实际执行程序,执行速度快,误报率加高。对于前两个特点,都较好理解,符合静态分析的执行过程,第三个特点也是静态分析中不可避免的,因为静态分析的人为干预因素较多,在静态分析的过程中,人为因素占据着分析结果中的较大成分,也正是人为干预所不能保证 100%的正确率,这就不可避免的增加了结果错误分析的几率。
控制流图控制流图(Control Flow Graph, CFG)也叫控制流程图,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向, 也能反映一个过程的实时执行过程。控制流图中每个在图形中的节点代表一个基本块,例如,没有任何跳跃或跳跃目标的直线代码块;跳跃目标以一个块开始,和以一个块结束。定向边缘被用于代表在控制流中的跳跃。在那里,在大部分介绍中,两个特定的设计块:项目块,通过它控制到流图的输入,和编辑块,通过它全面控制流输出。
本词条内容贡献者为:
王伟 - 副教授 - 上海交通大学