【课程笔记】南大软件分析课程3——数据流分析应用(课时3/4)

目录:

  1. 数据流分析总览

  2. 预备知识

  3. Reaching Definitions Analysis (may analysis)

  4. Live Variables Analysis (may analysis)

  5. Available Expressions Analysis (must analysis)

重点:

  • 理解3种数据流分析的含义,如何设计类似的算法,如何优化
  • 理解种数据流分析的共性与区别
  • 理解迭代算法并弄懂算法为什么能停止

1.数据流分析总览

may analysis:输出可能正确的信息(需做over-approximation优化,才能成为Safe-approximation安全的近似,可以有误报-completeness),注意大多数静态分析都是may analysis

must analysis:输出必须正确的信息(需做under-approximation优化,才能成为Safe-approximation安全的近似,可以有漏报-soundness)

Nodes (BBs/statements)、Edges (control flows)、CFG (a program)

例如

application-specific Data <- abstraction (+/-/0)

Nodes <- Transfer function

Edges <- Control-flow handling

不同的数据流分析 有 不同的数据抽象表达 和 不同的安全近似策略,如 不同的 转换规则控制流处理。

2-1-数据流分析总览.png

2.预备知识

输入/输出状态:程序执行前/执行后的状态(本质就是抽象表达的数据的状态,如变量的状态)。

数据流分析的结果:最终得到,每一个程序点对应一个数据流值(data-flow value),表示该点所有可能程序状态的一个抽象。例如,我只关心x、y的值,我就用抽象来表示x、y所有可能的值的集合(输入/输出的值域/约束),就代表了该程序点的程序状态。

Forward Analysis前向分析:按程序执行顺序的分析。OUT[s]=fs(IN[s]),s-statement

Backward Analysis反向分析:逆向分析。IN[s]=fs(OUT[s])

控制流约束:约束求解做的事情,推断计算输入到输出,或反向分析。

2-2-控制流约束.png

3.Reaching Definitions Analysis (may analysis)

问题定义:给变量v一个定义d(赋值),存在一条路径使得程序点p能够到达q,且在这个过程中不能改变v的赋值。

应用举例:检测未定义的变量,若v可达p且v没有被定义,则为未定义的变量。

抽象表示:设程序有n条赋值语句,用n位向量来表示能reach与不能reach。

(1)公式分析

什么是definition? D: v = x op y 类似于赋值。

Transfer Function:OUT[B] = genB U (IN[B] - killB) ——怎么理解,就是基于转换规则而得到。

解释:基本块B的输出 = 块B内的所有变量v的定义(赋值/修改)语句 U (块B的输入 - 程序中其它所有定义了变量v的语句)。本质就是本块与前驱修改变量的语句 作用之和(去掉前驱的重复修改语句)。

Control Flow:IN[B] = Up a_predecesso_of_B Out[P] ——怎么理解,就是基于控制流而得到。

解释:基本块B的输入 = 块B所有前驱块P的输出的并集。注意,所有前驱块意味着只要有一条路径能够到达块B,就是它的前驱,包括条件跳转与无条件跳转。

2-3-1-Reaching_Definition.png

(2)算法

目的:输入CFG,计算好每个基本块的killB(程序中其它块中定义了变量v的语句)和genB(块B内的所有变量v的定义语句),输出每个基本块的IN[B]和OUT[B]。

方法:首先所有基本块的OUT[B]初始化为空。遍历每一个基本块B,按以上两个公式计算块B的IN[B]和OUT[B],只要这次遍历时有某个块的OUT[B]发生变化,则重新遍历一次(因为程序中有循环存在,只要某块的OUT[B]变了,就意味着后继块的IN[B]变了)。

2-3-2-可达性分析算法.png

(3)实例:

抽象表示:设程序有n条赋值语句,用n位向量来表示能reach与不能reach。

说明:红色-第1次遍历;蓝色-第2次遍历;绿色-第3次遍历。

结果:3次遍历之后,每个基本块的OUT[B]都不再变化。

2-3-3遍历实例.png

现在,我们可以回想一下,数据流分析的目标是,最后得到了,每个程序点关联一个数据流值(该点所有可能的程序状态的一个抽象表示,也就是这个n位向量)。在这个过程中,我们对个基本块,不断利用基于转换规则的语义(也就是transfer functions,构成基本块的语句集)-OUT[B]、控制流的约束-IN[B],最终得到一个稳定的安全的近似约束集。

(4)算法会停止吗?

OUT[B] = genB U (IN[B] - killB)

大致理解:genB和 killB是不变的,只有IN[B]在变化,所以说OUT[B]只会增加不会减少,n向量长度是有限的,所以最终肯定会停止。具体涉及到不动点证明,后续课程会讲解。


4.Live Variables Analysis (may analysis)

问题定义:某程序点p处的变量v,从p开始到exit块的CFG中是否有某条路径用到了v,如果用到了v,则v在p点为live,否则为dead。其中有一个隐含条件,在点p和引用点之间不能重定义v。

2-4-1-live_variables定义.png

应用场景:可用于寄存器分配,如果寄存器满了,就需要替换掉不会被用到的变量。

抽象表示:程序中的n个变量用长度为n bit的向量来表示,对应bit为1,则该变量为live,反之为0则为dead。

(1)公式分析

Control Flow:OUT[B] = US a_successor_of_BIN[S]

理解:我们是前向分析,只要有一条子路是live,父节点就是live。

Transfer Function:IN[B] = useB U (OUT[B] - defB)

理解:IN[B] = 本块中use出现在define之前的变量 U (OUT[B]出口的live情况 - 本块中出现了define的变量)。define指的是定义/赋值。

特例分析:如以下图所示,第4种情况,v=v-1,实际上use出现在define之前,v是使用的。

2-4-2-公式推导.png

(2)算法

目的:输入CFG,计算好每个基本块中的defB(重定义)和useB(出现在重定义之前的使用)。输出每个基本块的IN[B]和OUT[B]。

方法:首先初始化每个基本块的IN[B]为空集。遍历每一个基本块B,按以上两个公式计算块B的OUT[B]和IN[B],只要这次遍历时有某个块的IN[B]发生变化,则重新遍历一次(因为有循环,只要某块的IN[B]变了,就意味前驱块的OUT[B]变了)。

问题:遍历基本块的顺序有要求吗? 没有要求,但是会影响遍历的次数。

2-4-3-live_variables算法.png

初始化规律:一般情况下,may analysis 全部初始化为空,must analysis全部初始化为all。

(3)实例

抽象表示:程序中的n个变量用长度为n bit的向量来表示,对应bit为1,则该变量为live,反之为0则为dead。

说明:从下往上遍历基本块,黑色-初始化;红色-第1次;蓝色-第2次;绿色-第3次。

结果:3次遍历后,IN[B]不再变化,遍历结束。

2-4-4-算法运行示例.png

5.Available Expressions Analysis (must analysis)

问题定义:程序点p处的表达式x op y可用需满足2个条件,一是从entry到p点必须经过x op y,二是最后一次使用x op y之后,没有重定义操作数x、y。(如果重定义了x 或 y,如x = a op2 b,则原来的表达式x op y中的x或y就会被替代)。

应用场景:用于优化,检测全局公共子表达式。

抽象表示:程序中的n个表达式,用长度为n bit的向量来表示,1表示可用,0表示不可用。

说明:属于forward分析。

(1)公式分析

Transfer Function:OUT[B] = genB U (IN[B] - killB)

理解:genB—基本块B中所有新的表达式(并且在这个表达式之后,不能对表达式中出现的变量进行重定义)-->加入到OUT;killB—从IN中删除变量被重新定义的表达式。

Control Flow:IN[B] = \capP a_predecessor_of_B OUT[P]

IN[B] = \cap_{P}\ _{a\ predecessor\ of\ B}OUT[P]

理解:从entry到p点的所有路径都必须经过该表达式。

2-5-1-可用表达式定义.png

问题:该分析为什么属于must analysis呢?因为我们允许有漏报,不能有误报,比如以上示例中,改为x=3,去掉 b=e16*x,该公式会把该表达式识别为不可用。但事实是可用的,因为把x=3替换到表达式中并不影响该表达式的形式。这里虽然漏报了,但是不影响程序分析结果的正确性。

(2)算法

目的:输入CFG,提前计算好genB和killB

方法:首先将OUT[entry]初始化为空,所有基本块的OUT[B]初始化为1...1。遍历每一个基本块B,按以上两个公式计算块B的IN[B]和OUT[B],只要这次遍历时有某个块的OUT[B]发生变化,则重新遍历一次(因为有循环,只要某块的OUT[B]变了,就意味后继块的IN[B]变了)。

2-5-2-可用表达式算法.png

(3)实例

抽象表示:程序中的n个表达式,用长度为n bit的向量来表示,1表示可用,0表示不可用。

说明:黑色-初始化;红色-第1次;蓝色-第2次。

结果:2次遍历后,OUT[B]不再变化,遍历结束。

2-5-3-算法运行示例.png

6.三种分析技术对比

Reaching Definitions Live Variables Available Expressions
Domain 赋值语句 变量 表达式
Direction forward backward forward
May/Must May May Must
Boundary OUT[Entry]=\phi IN[Exit]=\phi OUT[Entry]=\phi
Initialization OUT[B]=\phi IN[B]=\phi OUT[B]=U
Transfer function OUT=gen U (IN - kill) same same
Meet U U \cap

问题:怎样判断是May还是Must?

Reaching Definitions表示只要从赋值语句到点p存在1条路径,则为reaching,结果不一定正确;Live Variables表示只要从点p到Exit存在1条路径使用了变量v,则为live,结果不一定正确;Available Expressions表示从Entry到点p的每一条路径都经过了该表达式,则为available,结果肯定正确。


参考:

南大课件

南大视频课程

北大课件

Typora 使用 Markdown 嵌入 LaTeX 数学公式符号语法

typora-数学符号

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270