数据流分析
IMPORTANT
数据流分析推导数据沿着程序执行路径流动的信息。
分类
| 分类依据 | 具体分类 | 简要解释 |
|---|---|---|
| 依据语句顺序 | 流敏感分析 | 考虑程序语句的执行顺序 |
流不敏感分析 | 不考虑语句执行顺序 | |
| 依据流的方向 | 前向分析 | 从程序入口开始,沿着执行路径向出口方向分析 |
后向分析 | 从程序出口开始,逆着执行路径向入口方向分析 | |
| 依据路径的量化信息 | May (Union) 分析 | 考虑程序所有可能执行的路径 |
Must (Intersection) 分析 | 考虑程序必然执行的路径 | |
| 依据对过程的处理 | 过程内分析 | 仅分析单个过程(函数/方法)内部的逻辑 |
| 过程间分析 | 分析多个过程间的调用关系 |
命令式程序语言
在保证分析有效性的前提下,为了降低分析复杂度,通常会定义一种简化抽象的语言作为程序分析对象,从而剥离无关细节,避免陷入真实程序设计语言的细节泥潭。这里给出一种简单命令式语言(无过程或高级数据结构)—— 语言。
语法
| Category | Domain | Meta variable |
|---|---|---|
| 类别 | 语法定义 | 所属集合 |
|---|---|---|
| Arithmetic expressions () | ||
| Boolean expressions () | ||
| Commands (statements, ) |
示例
下面是一个 语言示例:
控制流表示
打标签的程序(Labelled Programs)
IMPORTANT为了标注分析信息所附着的
位置信息,通常会为程序的每一条可执行语句、控制结构的关键节点(如循环判断、分支判断点)分配唯一的标签()。
对于 语言,数据流信息附着于 语句、赋值语句、条件测试语句以及循环语句。即:
TIP这里注意 作为
顺序复合语句,不需要标注,因为其中的 和 本身包含标签。
IMPORTANT对于程序 中被打标签的片段称为
块,记作 。
对于前面的示例代码,对其标注标签后:
控制流表示
IMPORTANT每个打标签的语句有一个
单入口()和可能的多个出口()。
映射
对于程序语句存在映射:
其中, 表示程序中的语句集合, 表示标签集合。 映射是一个全函数,即 使得 ,其中 表示语句 的唯一入口。
针对 语言,定义 映射为:
其中, 表示复合语句应递归地获取该复合语句第一条语句的入口作为整个符合语句的入口。
映射
此外,程序语句存在映射:
TIP这里的 表示 标签集合的
幂集,其每个元素均为 集合的子集,即 。
其中, 表示程序中的语句集合, 表示标签集合。 映射同样是一个全函数, 使得 ,其中 表示语句 所有可能的出口集合。
对于 语言,定义 映射为:
需要注意第 条,对于循环语句,跳出循环前要判断循环条件 不成立。
(控制)流关系
IMPORTANT前面定义了程序语句的位置标签、 与 映射,于是可以定义程序
(控制)流关系:其中, 即
笛卡尔积。对于笛卡尔积 有, ,其中 且 。对于 , ,则 表示在程序语句 中,存在控制流从位置标签 流向了 。
对于 语言,定义 为:
TIP关注标红部分,对于
顺序复合语句,需要增加从语句 到 的控制流边;对于条件判断语句需要增加由判断条件到语句 以及判断条件到语句 的控制流边;对于循环判断语句则不仅需要添加判断条件到语句 的控制流边,还需添加语句 所有可能出口到判断条件 的控制流边。
示例
计算 、 映射以及控制流关系:
从而根据上述信息可以构建控制流图:

NOTE数据流分析本质上都是把程序看成是一个图,分析算法都是基于图表示的。