网易首页 > 网易号 > 正文 申请入驻

程序分析理论 第三部分 控制流分析 以语法为导向和基于约束

0
分享至

前言

本篇文章是程序分析理论部分第八篇,关于以语义为导向和基于约束的控制流分析,不仅仅有分析语义,还有部分理论证明以及最后的伪代码说明。此外,本篇文章中的例子本身在之前的文章中都出现过,虽然之前也分析过,但是这次增加了新的知识。

以语法为导向的上下文不敏感的控制流分析 Syntax Directed 0-CFA Analysis

经过上一篇的理论证明,我们得到控制流分析存在一个最小的解,但是仅仅根据上一篇文章的分析方法,我们不能利用数学的等式计算出最小解。所以我们以语法为导向得到有限约束集。使得最小解可以计算得到。

对于两个控制流分析的解,如果任意一个的最小解是另一个解的解,那么两解的公共部分一定是包含于真正的最小解之中。

例子 Example

和之前上下文不敏感的控制流分析的抽象化一样,对于let in 结构,我们可以列出这样的式子:(C , p) |= (fun f x => (f ^1(fn y => y ^2) ^3) ^4) ^5 (C , p) |= (g ^6(fn z => z ^7) ^8) ^9 C(5) 包含于 p(g) C(9) 包含于C(10)

对于fun结构,我们列出:{fun f x => (f ^1(fn y => y ^2)^3)^4}包含于C(5) 也包含于p(f) (C , p) |= (f ^1(fn y => y ^2)^3)^4

对于t_1 t_2的结构得到 (C , p) |= f ^1 (C , p) |=(fn y => y ^2)^3。

对于fn 得到{fn y => y ^2}包含于C(3) (C , p) |=y ^2

对于y ^2得到p(y) 包含于 C(2)

对于(C , p) |= (g ^6 (fn z => z ^7) ^8) ^9得到 (C , p) |= g ^6 (C , p) |= (fn z => z ^7) ^8

g为f的结果

{fn z => z ^7} 包含于 C(8) p(z) 包含于C(7)

我们可以最终得到

(C , p) |= (fun f x => (f ^1(fn y => y ^2) ^3) ^4) ^5

(C , p) |= (g ^6(fn z => z ^7) ^8) ^9

(C , p) |= (f ^1(fn y => y ^2)^3)^4

(C , p) |= f ^1

(C , p) |=(fn y => y ^2)^3

(C , p) |=y ^2

(C , p) |= g ^6

(C , p) |= (fn z => z ^7) ^8

上述式子我们可以合并成(C , p) |= (fun f x => (f ^1(fn y => y ^2) ^3) ^4) ^5 (C , p) |= (g ^6(fn z => z ^7) ^8) ^9。

接下来,我们简单证明上面的结果是代码的最小解:我们将整段代码的关系记作(C ^T, p ^T),也就是任意一句包含在这一段代码中的代码的关系(C , p)都包含在(C ^T, p ^T)中,同样的每一句代码的最小解也一定包含于(C ^T, p ^T)中。所以,当(C ^1, p ^1) 和(C ^2, p ^2)拥有一个共同的表达式满足对应关系,那么这个表达式就可以对(C ^1, p ^1) 和(C ^2, p ^2)进行共同描述。

根据上面的定理我们可以得到上述的结果是所有(C , p)的共同描述。

同时,由于(C , p)是有限的,(C , p)的任何描述的子集都在上述结果中,所以上述结果是一个摩尔集,也就是最小解。

基于约束的上下文不敏感的控制流分析Constraint Based 0-CFA Analysis

在之前的分析中,我们已经实际上已经得到了控制流的约束条件。对于上述例子就是满足

C(5) 包含于 p(g)

C(9) 包含于C(10)

f 包含于C(5) 也包含于p(f)

{fn y => y ^2}包含于C(3)

p(y) 包含于 C(2)

p(z) 包含于C(7)

也就是说控制流的约束条件就是满足(C , p) |= e_0的条件

即:(我们将C[]表示为约束条件)

C[c ^l] = 空集

C[x ^l] = {r(x) 包含于 C(l)}

C[(fn x => e_0) ^l] = {{fn x => e_0} 包含于 C(l)} C(e_0)

C[(fun f x => e_0) ^l] = {{fun f x => e_0} 包含于 C(l)} C(e_0) {{fun f x => e_0} 包含于 r(f)}

C[(t_1 ^l_1 t_2 ^l_2) ^l] = C[t_1 ^l_1] C[t_2 ^l_2] 当fn x => t_0 ^l_0在t_1中或者 fun f x => t_0 ^l_0在t_1中 时 C(l_2) 包含于 r(x) C(l_0) 包含于 C(l)

C[(if t_0 ^l_0 then t_1 ^l_1 else t_2 ^l_2) ^l] = C[t_0 ^l_0] C[t_1 ^l_1] C[t_2 ^l_2] C[l_1] 包含于 C[l] C[l_2] 包含于 C[l]

C[(let x = t_1 ^l_1 in t_2 ^l_2) ^l] = C[t_1 ^l_1] C[t_2 ^l_2] C[l_1] 包含于 r[x] C[l_2] 包含于 C[l]

C[(t_1 ^l_1 op t_2 ^l_2) ^l] = C[t_1 ^l_1] C[t_2 ^l_2]

例子Example

根据t_1 t_2的形式以及fn x => x 的形式,我们得到下面结果

C[((fn x = x ^1) ^2 (fn y => y ^3) ^4) ^5] = {

{fn x => x ^1} 包含于 C(2)

r(x) 包含于 C(1)

{fn y => y ^3} 包含于 C(4)

r(y) 包含于C(3)

左表达式包含参数,右表达式对左表达式的参数进行操作 ==> C(4) 包含于 r(x)

C(4)对y进行操作 ==> C(4) 包含于 r(y)

C(1) 包含于 C(5)

C(3) 包含于 C(5)

}

C[e_0] 和 (C , p)关系是C[e_0]是约束关系的实体,(C , p)是约束关系的逻辑表示,(C , p) |= e_0 需要满足 C[e_0] 。约束条件中的C(l) 与 (C , p)的C对应 。r(x) 与 (C , p)中的p对应。

我们对于相互转化的关系用 (C , p) [C(l)] = C(l) 和 (C , p)[r(x)] = p(x)表示。

其中对于基本类型语句t (C , p) [{t}] = {t} 对于本身是运算又会返回值参与其他运算的语句t (C , p) [{t}] 包含于 rhs’ => lhs] = (C , p) [lhs]

所以我们可以得到这样的式子 (C , p) |= C[e]

我们简单证明式子成立且为最小解: 举一个t_1 ^l_1 t_2 ^l_2的例子,l_1的运算结果会运用到t_2中所以(C_1, p_1)包含于(C_2, p_2),也就是约束条件渐渐叠加。因为(C ,p) 是有限个,所以有一个解是极限值,也就是最小解。

在实际应用中,我们可以用链表的形式记录:

对一个C[e]的约束条件,我们生成(C , p)来储存。首先进行初始化,生成空的链表,然后根据语句类型生成限制条件链以及变量,当语句为fn x => x 时将id_x保存至D[C(l)]中并且生成限制条件添加在E[q]中。当语句是其他时,生成限制条件添加在E[q]中。然后根据约束条件生成由最初的根语句对应的工作列表的解逐步演变成最终工作列表的解。即将参数id根据约束条件记录进D[C(l)]中。

我们简单证明该解为最小解:首先,对于第一步和第二步是显然有界的,第三部由于代码块有限,所以约束条件也是有终止的。所以解是可计算的。然后证明为最小解,假设(C‘ , p’) |= C[e] 那么任意D[C(l)] 包含于 C’(l)中 D[r(x)] 包含于 p’(x)中。这在第一步中实现。随后第二部中保证了对于任何形式的t p的处理使得(C , p) |= C[e]始终满足。所以该解为最小解。

根据上面的描述,我们得到以下结论:(C , p) |= C[e] 是最小解,以语法为导向和基于约束的结果是相同的,

伪代码

Init : W = nil D[q] = nil E[q] = nil

Build :

for cc in C[e] : case cc of {t} p : add(p,{t}) p1 p2 : E[p1] = cons(cc,E[p1]) t p => p1 p2:E[p1] = cons(cc,E[p1]) E[p] = cons(cc,E[p])

Iteration :

while W ≠ nil : q = head(W) W = tail(W) for cc in E[q] case cc of p1 p2 : add(p2,D[p1]) {t} p => p1 p2: if t ∈ D[p] then add(p2,D[p1])

最后

欢迎指教
DR@03@星盟

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
苏州提升普高率背后的巨额投入与努力

苏州提升普高率背后的巨额投入与努力

鬼菜生活
2026-02-15 21:27:44
总投资近50亿!山东两大儿童医院即将投运,补齐鲁南短板!

总投资近50亿!山东两大儿童医院即将投运,补齐鲁南短板!

三农老历
2026-02-15 21:43:46
万万没想到!美国对华最大的失算,是让中国彻底清醒了

万万没想到!美国对华最大的失算,是让中国彻底清醒了

迎男而上
2026-02-15 11:21:26
热搜爆了!宋轶换背景后取关!白敬亭方回应很强势

热搜爆了!宋轶换背景后取关!白敬亭方回应很强势

白色得季节
2026-02-15 18:23:32
张一鸣登顶,雷军排第十,2026富豪榜大洗牌:十年河东十年河西

张一鸣登顶,雷军排第十,2026富豪榜大洗牌:十年河东十年河西

大卫聊科技
2026-02-02 12:37:28
从46败到40胜,冲上联盟第1!NBA最大黑马,成哈登争冠路上绊脚石

从46败到40胜,冲上联盟第1!NBA最大黑马,成哈登争冠路上绊脚石

老侃侃球
2026-02-16 03:30:04
张干曾力主开除毛泽东,1950年毛主席却给政府致信:给他供资养老

张干曾力主开除毛泽东,1950年毛主席却给政府致信:给他供资养老

雍亲王府
2026-02-15 14:30:03
刚刚,日本专家质疑王毅警告,中国不骂俄罗斯,凭什么骂我们?

刚刚,日本专家质疑王毅警告,中国不骂俄罗斯,凭什么骂我们?

天气观察站
2026-02-15 21:09:34
不到24小时,特朗普闹出6个国际笑话,美国人又要心碎了

不到24小时,特朗普闹出6个国际笑话,美国人又要心碎了

欧洲报姐
2026-02-15 10:36:12
事发上海火车站!25年前在这里走丢的孩子,终于在春节前回家了!

事发上海火车站!25年前在这里走丢的孩子,终于在春节前回家了!

西莫的艺术宫殿
2026-02-15 14:53:46
主持人问秦志戬,带过这么多世界冠军,最舍不得的是谁?

主持人问秦志戬,带过这么多世界冠军,最舍不得的是谁?

小光侃娱乐
2026-01-29 21:20:03
谁能想到她已经62了,说18都有人信,怎么做到这么好的状态的

谁能想到她已经62了,说18都有人信,怎么做到这么好的状态的

白宸侃片
2026-02-11 11:56:19
故宫冷宫为何从不开放?退休人员揭秘真相,并非民间传说那般简单

故宫冷宫为何从不开放?退休人员揭秘真相,并非民间传说那般简单

千秋文化
2026-02-13 18:59:55
歌手孙悦将在山东春晚演唱《祝你平安》,称32年前第一次听时处于人生最低谷:一个镜子扎到眉毛上缝了3针,没想到这首歌又翻红了

歌手孙悦将在山东春晚演唱《祝你平安》,称32年前第一次听时处于人生最低谷:一个镜子扎到眉毛上缝了3针,没想到这首歌又翻红了

大风新闻
2026-02-15 19:02:06
五五分流为什么分不下去了?背后的真相

五五分流为什么分不下去了?背后的真相

枫冷慕诗
2026-01-24 13:09:19
彻底撕破脸!荷兰法院强行冻结中企股权,中方三大重拳砸向要害!

彻底撕破脸!荷兰法院强行冻结中企股权,中方三大重拳砸向要害!

小蒋爱唠嗑
2026-02-16 02:52:11
大批日籍华人纷纷回国,还希望“祖国”接纳,中国会不会接受?

大批日籍华人纷纷回国,还希望“祖国”接纳,中国会不会接受?

全球热点幕后
2026-02-15 21:35:45
爆冷!NBA20 大巨星历史排名出炉 现役 4 人跻身前 15

爆冷!NBA20 大巨星历史排名出炉 现役 4 人跻身前 15

澜归序
2026-01-21 05:54:58
唏嘘!孙颖莎回老家石家庄过年,7年来首次春节回家和父母亲人团圆

唏嘘!孙颖莎回老家石家庄过年,7年来首次春节回家和父母亲人团圆

818体育
2026-02-15 21:58:44
黄大宪连续三届冬奥夺牌光芒盖过宿敌林孝埈:我伤病严重难以发挥

黄大宪连续三届冬奥夺牌光芒盖过宿敌林孝埈:我伤病严重难以发挥

杨华评论
2026-02-15 09:32:31
2026-02-16 06:24:49
安全客 incentive-icons
安全客
有思想的安全新媒体
1360文章数 4753关注度
往期回顾 全部

科技要闻

发春节红包的大厂都被约谈了

头条要闻

大学生寒假为妈妈店铺当中老年服装模特 撞脸明星

头条要闻

大学生寒假为妈妈店铺当中老年服装模特 撞脸明星

体育要闻

NBA三分大赛:利拉德带伤第三次夺冠

娱乐要闻

2026央视春晚最新剧透 重量级嘉宾登场

财经要闻

谁在掌控你的胃?起底百亿"飘香剂"江湖

汽车要闻

奔驰中国换帅:段建军离任,李德思接棒

态度原创

本地
游戏
健康
手机
军事航空

本地新闻

春花齐放2026:《骏马奔腾迎新岁》

没想到一名粉毛老婆,带着对玩家的爱与谎言,虏获了玩家们的心!

转头就晕的耳石症,能开车上班吗?

手机要闻

荣耀Magic V6真机现身,圆形Deco、红色机身

军事要闻

特朗普:在俄乌冲突问题上 泽连斯基必须行动起来

无障碍浏览 进入关怀版