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

程序分析理论 第五部分 对控制流分析的基于类型和响应的系统模型

0
分享至

前言

本篇是程序分析理论第十一篇:基于类型和响应的系统模型Type and Effect Systems

想法:加入type模型在分析过程中触发响应模型实现函数指向。

基于类型的系统模型 Type System

基于类型的系统模型首先要引入类型要素,类型要素包括bool,类型转换,int。我们分析的语句形式包括:变量,true /false , e e,fn , fun ,let in。

首先,我们做出基于类型的函数语言的语法:

和之前的语法相似,常数为c ,变量为 x,函数fnπ x => e_0 ,递归函数 fun\π f x => e_0 ,并列语句 e_1 e_2 ,if语句 if e_0 then e_1 else e_2 ,函数调用语句 let x = e_1 in e_2 ,判断语句 e_1 op e_2。其中不同的是在函数和递归函数中添加了断点π。

接着,我们提出底层类型模型实现类型判断:

用语句表示就是Γ |- e : t

其中Γ表示 。e表示抽象语句 ,t表示类型

任意 c 存在type,如 true = bool 7 = int

对于任意判断语句参数为int类型,结果为bool类型

应用到所有语句就会变成:

Γ |- c : t_c

Γ |- x : t Γ(x) = t

Γ[x->tx] |- e_0 : t_0 / Γ |- fnπ x=>e_0 : t_x -> t_0 (x类型是t_x,e_0最后输出类型是 t_0)

Γ[f -> tx->t_0][x->t_x] |- e_0 : t_0 / Γ |- funπ f x=>e_0 : t_x -> t_0 (x类型是t_x,e_0最后输出类型是 t_0,递归时,f作为t_x进入以t_0输出)

Γ |- e_1 : t_2 -> t_0 Γ |- e_2 : t_2 / Γ |- e_1 e_2 -> t_0 (e_1将t_2类型转换成t_0,e_2是t_2类型。最后输出是t_0类型)

Γ |- e_0 : bool Γ |- e_1 : t Γ |- e_2 : t / Γ |- if e_0 then e_1 else e_2 : t (经过判断后执行语句)

Γ |- e_1 : t_1 Γ[x -> t_1] |- e_2 : t_2 / Γ |- let e_1 in e_2 : t_2 (最终根据e_2确定type)

Γ |- e_1 : t_1 Γ |- e_2 : t_2 / Γ |- e_1 op e_2 : t (判断语句两个参数是可以比较的类型,返回值是bool类型)

例子 Example

首先let in结构Γ |- e_1 : t_1 Γ[x -> t_1] |- e_2 : t_2 / Γ |- let e_1 in e_2 : t_2

fun 结构Γ[f -> tx->t_0][x->t_x] |- e_0 : t_0 / Γ |- funπ f x=>e_0 : t_x -t_0

fn结构Γ[x->tx] |- y : t_0 / Γ |- fn\π x=>y : tx -> t_0 Γ[x->t_x] |- z : t_0 / Γ |- fnπ x=>z : t_x -t_0

e_1 e_2结构 Γ |- e_1 : t_2 -> t_0 Γ |- e_2 : t_2 / Γ |- e_1 e_2 -> t_0

总结下来的操作就是 [f -> (t -> t) -> (t -> t)] [x -> t ->t] 递归函数中,不断循环fn y的操作,再执行fn z的操作。

所以基于类型的系统模型应用在控制流分析中可以根据数据类型调用函数,int bool始终是本身,t->t代表是一个函数的抽象。

由于存在多个相同的类型转换的函数抽象无法区别彼此,我们添加标记φ。

我们在之前的fn和fun结构中增加了断点,此时可以应用这些断点进行区别。

基于响应的系统模型Effect System

对于特定type_1和特定type_2形成对应关系的语句,我们应当作出相应的特定操作。这就是基于响应的思想。

对于控制流,我们要做的响应是抽象函数的调用。对于异常,我们要做出不同特定的响应。对于作用域我们要对数据作用域作出响应。对于交互我们要对不同时间的信号作出响应。

要实现这样一个系统模型,我们要使用基于类型的函数语言,底层类型系统,响应系统的拓展。

首先基于类型的函数语言和底层类型系统在上面已经提到,响应系统的拓展就是使用上面提到的φ进行。

上一个例子我们得到 [f -> (t -> t) -> (t -> t)] [x -> t ->t]的结论,但是转换之间调用的函数无法确定,此时我们应用φ。

由于存在fn y和fn z,所以同类φ中存在y z 两种方法,实际执行中可能是两种之中的一个。还有fun f,同类φ中只有F。至于g ()则不调用函数,为空。

最后得到 [f -> (t – {Y,Z} -> t) – {F} -> (t – 空 -> t)] [x -> t – {Y,Z} ->t]

仅仅记录调用函数肯定不能直接实现程序分析,还要有值,也就是程序中一定存在某处是赋值语句,在控制流分析中,我们把赋值语句也当作了函数,或者说某个函数的返回值是一个值,所以我们可以做出e -> v 的归纳。

加上这一归纳后的语法也发生了一些变化:

c -> c

fn_π x => e0 —> fn\π x -> e_0

fun_π f x -> e0 —> fn\π x ->(e0[f -> fun\π f x -> e_0]) (在递归过程中,不断分解成fn x -> e_0)

e_1 —> fn_π x -> e_0 e_2 —> v_2 e_0[x -> v_2] —> v_0 / e_1 e_2 —>v_0 (e_1是一个函数,e_2是赋值,最终是将v_2当作x代入函数,返回值v_0)

e_0 —>true e_1 —>v_1 / if e_0 then e_1 else e_2 —> v_1 (判断为true返回e_1的返回值)

e_0 —>false e_2 —>v_2 / if e_0 then e_1 else e_2 —> v_2 (判断为false返回e_2的返回值)

e_1 -> v_1 e_2[x->v_1] ->v_2 /let x = e_1 in e_2 ->v_2 (函数返回值为v_1 代入e_2中得到v_2)

e_1 —> v_1 e_2 —> v_2 / e_1 op e_2 — v (v_1 op v_2 = v)

依旧是上面的例子

let in结构g为fun返回值

—> fun_F f x => f (fn_Y y => y) fn_z z => z

—>递归函数为 fn_F x => ((fun_F f x => f (fn_Y y => y)) fn_Y y => y)

—> v g返回值为v

推理算法 Inference Algorithms

明确了模型,接下来我们要选择算法实现模型。

首先,对于类型而言,除了明确定义与常数的类型确定,有些函数或语句的返回结果无法确定,所以在实际运用中,我们添加α用来表示这些类型的集合,对于一个返回值,我们与α一个类型建立映射。而这个类型我们用断点去命名。

虽然表示了类型,但是类型依旧不能明确,所以需要通过上下文加以限制从而使用算法去判断数据类型。因此我们增加新的语法:U

U是用于建立上下文联系的工具,对于U(int,int) 和U(bool,bool),我们保持原有id集合记录类型,对于U(t_1 -> t_2 , t’_1 ->t’_2)记作θ_1 o θ_2 。θ_1要满足θ_1 t_1 -> θ_1 t’_1 θ_2要满足θ_2(θ_1 t_2) ->θ_2(θ_1 t’_2)。即要想t_1 -> t_2 , t’_1 ->t’_2等价,需要满足t_1和t’_1存在映射, t_2和t’_2存在映射,最终实现 t_1 -> t_2 和 t’_1 ->t’_2存在映射。而映射关系就是θ_1 o θ_2。对于U(α , t) 和U(t , α)则需要α 是 t 或者 α 是 t没有表示的类型。记作[α -> t]

例子

U(a -> a,(b -> b) -> c)

存在θ_1满足a和b->b存在类型映射,θ_2满足a和c存在类型映射。除此之外,还需要b -> b和c存在类型映射关系,即[a|-> b->b] [a |-> c] [c |-> b->b]

接下来我们对所有语句类型进行语法描述

W(Γ , c) = (t_c ,id) 对于常数 c ,数据类型为 t_c 保存在 id集合中

W(Γ , x) = (Γ(x) ,id) 对于变量 x ,数据类型为 Γ(x) 保存在 id集合中

W(Γ , fn_π x => e_0) = let α_x be fresh (t_0 ,θ_0 ) = W(Γ[x->α_x] , e_0) in ((θ_0,α_x) -> t_0 , θ_0) 对于函数fn ,将 x 的数据类型先设为空,判断e_0语句中变量的数据类型,和 x 建立映射,保存在θ中。

W(Γ , fun_π f x => e_0) = let α_x α_0 be fresh (t_0 ,θ_0 ) = W(Γ[x->α_x -> α_0][x -> α_x] , e_0) θ_1 = U(t_0,θ_0,α_0) in (θ_1(θ_0,α_x) ->θ_1 t_0 , θ_1 o θ_0) 对于递归函数fun f,将 x 和输出的数据类型先设为空,判断e_0语句中变量的数据类型,和 输出 建立映射,保存在θ_0中。将 x 和输出进行复制保存在θ_1中。

W(Γ , e_1 e_2) = let (t_1, θ_1) = W(Γ,e_1) (t_2, θ_2) = W(θ_1 Γ,e_2) α be fresh θ_3 = U (θ_2 t_1,t_2 -> α ) in (θ_3 α,θ_3 o θ_2 o θ_1 ) 对于e_1 e_2 ,将 返回值 的数据类型先设为空,判断e_1 e_2语句中变量的数据类型,和 返回值 建立映射,保存在θ_3 o θ_2 o θ_1中。

W(Γ , if e_0 then e_1 else e_2) = let (t_0, θ_0) = W(Γ,e_0) (t_1, θ_1) = W(θ_0 Γ,e_1) (t_2, θ_2) = W(θ_1(θ_0 Γ) ,e_2) θ_3 = U (θ_2(θ_1 t_0),bool ) θ_4 = U (θ_3 t_2,θ_3(θ_2 t_2) ) in (θ_4(θ_3 t_2) , θ_4 o θ_3 o θ_2 o θ_1 ) 对于if,判断e_1 e_2语句中变量的数据类型,根据e_0选择e_1 或 e_2和 返回值 建立映射,保存在θ_4 o θ_3 o θ_2 o θ_1中。

W(Γ , let x = e_1 in e_2) = let (t_1, θ_1) = W(Γ,e_1) (t_2, θ_2) = W((θ_1 Γ)[x->t_1,e_2) in (t_2 , θ_2 o θ_1 ) 对于let in ,判断e_1 语句中变量的数据类型,代入到e_2中判断返回值数据类型,保存在 θ_2 o θ_1中。

W(Γ , e_1 op e_2) = let (t_1, θ_1) = W(Γ,e_1) (t_2, θ_2) = W(θ_1 Γ,e_2) θ_3 = U (θ_2 t_1,t_op ) θ_4 = U (θ_3 t_2,t_op ) in (t_op,θ_4 o θ_3 o θ_2 o θ_1) 对于e_1 op e_2 ,判断e_1 e_2语句中变量的数据类型,建立类型映射保存到到θ_4 θ_3中 ,将t_op保存在θ_4 o θ_3 o θ_2 o θ_1中。

上面是基于类型的系统模型的算法语法,接下来是基于响应的系统模型。

对于响应系统的拓展,我们用β表示响应集合,用数字区分各个响应。和上面语法类似,我们要建立类型统一:对于U(int,int)和U(bool,bool)没有区别,对于U(t_1 -β-> t_2,t’_1 -β‘->t’_2 ),除了之前的t_1和t’_1 ,t_2和t’_2存在映射外,β和β’也要存在映射。

例子

U(a -1-> a,(b -2->b) -3-> c)

1和3存在映射 [3 |->1]

其余和基于类型的结果一样[a |-> b-2->b][c |-> b -2-> b]

最终得到[3 |->1][a |-> b-2->b][c |-> b -2-> b]

除此之外,我们1 ,2,3进行约束,即与实际建立联系。

例子

(fn_X x=>x) (fn_Y y=>y)

对于上面的例子,我们可以抽象成a -1-> a,(b -2->b) -3-> c

其中,我们将1和X建立联系,2和Y建立联系。从而明确调用内容。

最后我们对之前的例子完整应用上面的算法。

对于let in结构,我们直接将g替换

(fun_F f x => f (fn_Y y => y)) (fn_Z z=>z)

对于(fun_F f x => f (fn_Y y => y))我们可以抽象成g |-> (a -2-> a) -1->b 其中1是F 2是Y

对于(fn_Z z=>z)我们抽象成c -3-> c -4->d

(fun_F f x => f (fn_Y y => y)) (fn_Z z=>z)是 e_1 e_2的结构,所以存在类型匹配,即 a -> c b ->d 1->4 2->3

所以4包含F,3包含Y,同时由于3本身是fn_Z z=>z,所以3包含Z

也就是这一段代码我们可以简化成 (a->a) ->b,其中 a->a的处理机制2和3,也就是YZ机制,->b包含F机制和输出机制。

最后

欢迎指教
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.

相关推荐
热点推荐
热议大连1-0成都:李国旭为本土教练扛旗,成都心态已碎成渣

热议大连1-0成都:李国旭为本土教练扛旗,成都心态已碎成渣

懂球帝
2026-10-24 17:54:13
陈永奇任江西省政府党组书记

陈永奇任江西省政府党组书记

新京报
2026-10-24 18:16:14
诺里:克林根在场能提升防守,他不在场我们就靠小阵容撑住局面

诺里:克林根在场能提升防守,他不在场我们就靠小阵容撑住局面

懂球帝
2026-10-24 16:09:24
拉唐错失绝平点球 上海申花客场不敌深圳新鹏城

拉唐错失绝平点球 上海申花客场不敌深圳新鹏城

五星体育
2026-10-24 17:52:49
日本网友破防了,张雪机车在WSBK首个赛季就拿制造商年度第三、车手年度亚军

日本网友破防了,张雪机车在WSBK首个赛季就拿制造商年度第三、车手年度亚军

哲学船
2026-10-20 00:37:15
万斯:“星链”使用取决于美国对基辅和莫斯科的政策,而非马斯克

万斯:“星链”使用取决于美国对基辅和莫斯科的政策,而非马斯克

阿尔卑斯瞭望
2026-10-23 19:10:55
湖南大山里发现一株饭碗粗的野生柘树,全身是刺,却是古代的“帝王木”,可惜多数人不认识

湖南大山里发现一株饭碗粗的野生柘树,全身是刺,却是古代的“帝王木”,可惜多数人不认识

农夫也疯狂
2026-10-22 16:27:11
骑士爆发矛盾,米切尔公开质疑哈登,希望他能认真防守

骑士爆发矛盾,米切尔公开质疑哈登,希望他能认真防守

篮球小方
2026-10-24 12:09:25
大锤砸掉硫磺岛纪念雕像头颅,27岁男子被捕

大锤砸掉硫磺岛纪念雕像头颅,27岁男子被捕

观察者网
2026-10-23 18:36:44
张雨绮这个V开到肚脐眼下了,太敢穿了

张雨绮这个V开到肚脐眼下了,太敢穿了

情感大头说说
2026-10-17 04:20:04
海南男子钓获稀有海鱼,鳞片晶莹发绿,像玉雕工艺品!网友:所以说龙一定存在

海南男子钓获稀有海鱼,鳞片晶莹发绿,像玉雕工艺品!网友:所以说龙一定存在

狸猫之一的动物圈
2026-10-21 09:04:47
微信回应iPhoneDuo不适配:可以让开发者等,但别让用户等!

微信回应iPhoneDuo不适配:可以让开发者等,但别让用户等!

城事堂
2026-10-22 14:26:42
郑欣宜的靠山,不是郑少秋也不是沈殿霞的遗产,而是事事兜底的她

郑欣宜的靠山,不是郑少秋也不是沈殿霞的遗产,而是事事兜底的她

白面书誏
2026-10-24 16:06:39
中共中央决定:莫高义任云南省委书记,王宁不再担任云南省委书记职务

中共中央决定:莫高义任云南省委书记,王宁不再担任云南省委书记职务

政知新媒体
2026-10-24 16:46:49
A股今天大反攻!任泽平高呼“市场底”,网友:希望您不要点评股市

A股今天大反攻!任泽平高呼“市场底”,网友:希望您不要点评股市

金石随笔
2026-10-24 07:18:09
许家印在看守所的待遇

许家印在看守所的待遇

年代回忆
2026-10-22 23:21:45
新婚夫妻用AI生成婚纱照,花费约3小时,被人看出来不觉得尴尬,当事人:跟金钱无关,两个人以后把日子过好这些都不是问题

新婚夫妻用AI生成婚纱照,花费约3小时,被人看出来不觉得尴尬,当事人:跟金钱无关,两个人以后把日子过好这些都不是问题

背包旅行
2026-10-16 18:08:08
3连败崩盘!50岁蓉城洋帅仍拒辞职:赛季后再说 现在放弃就真完了

3连败崩盘!50岁蓉城洋帅仍拒辞职:赛季后再说 现在放弃就真完了

我爱英超
2026-10-24 18:29:33
10-5!斯诺克冠军诞生:23岁中国名将捧杯,吴宜泽获得157万奖金

10-5!斯诺克冠军诞生:23岁中国名将捧杯,吴宜泽获得157万奖金

老牛体育解说
2026-10-04 22:53:41
张不开嘴别演戏!看《伟大的长征》彭总吃扣肉,对假吃演员应激了

张不开嘴别演戏!看《伟大的长征》彭总吃扣肉,对假吃演员应激了

调侃国际观点
2026-10-24 14:22:36
2026-10-24 19:00:49
安全客 incentive-icons
安全客
有思想的安全新媒体
1360文章数 4754关注度
往期回顾 全部

科技要闻

写程序、做3D,新Kimi还有多少本事?

头条要闻

媒体:俄美乌要谈了 顿巴斯地区归属成关键“卡点”

头条要闻

媒体:俄美乌要谈了 顿巴斯地区归属成关键“卡点”

体育要闻

从乐透秀到总冠军再到没工作 一共要几年?

娱乐要闻

翁虹19岁女儿三次拒爱,在美国上学却“不随便”

财经要闻

叫"保障"不叫"保险":租车平台的文字游戏

汽车要闻

大众安徽与众09正式上市 双十一权益价16.99万起

态度原创

亲子
本地
数码
公开课
军事航空

亲子要闻

韩国全职妈妈遭孩子蔑视:爸爸上班我上学,妈妈只是在家躺着享福……

本地新闻

这么近,那么美,周末赴贺州丨大湾区后花园

数码要闻

三星首款耳夹式耳机:Galaxy Buds On动图曝光,透明盒盖抢眼

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

辽宁舰编队远海训练细节首度披露

无障碍浏览 进入关怀版