Point-to Analysis指针分析(2)

https://blog.csdn.net/qq_43391414/article/details/111046505

下面介绍一种新的指针分析的算法Steensgaard算法,并将其与上一篇文章介绍

Steensgaard算法
不同于Andersen算法,Steensgaard在前者的基础上,再次对问题进行了简化,从而指针分析的速度变快了,但是损失了精度。
那么其究竟是如何的一个过程呢?

约束
前面都和Andersen算法过程及其类似,但是约束变了。
这个是Andersen的约束条件(其实就是上一篇文章中的那个表)。

在这里插入图片描述

Steensgaard改成了:

在这里插入图片描述

可以看到,区别就在于将子集关系直接换成了等号,从而使得指针分析变得大大简化,从而直接在线性时间分析完毕。(注意:这里的线性时间o(n)中的n是指:指针语句的个数。)

流程

Steensgaard算法的流程十分简单,如下,一看就懂。
假设有如下指针语句:

 在这里插入图片描述

我们先看红色部分的指针语句,那么和Andersen算法一样,写出约束,然后初始化约束图(下面的约束图没有画出aryA,aryB节点,但是这不要紧)。

 在这里插入图片描述

继续分析下一句:

在这里插入图片描述

写出约束,并完善约束图。

在这里插入图片描述

解释:第5个语句的函数调用过程其实是:

 

p=t1,q=t2

 这个是函数的参数传递。所以根据上面两条我们可以写出约束(注意在Steensgaard中这个简单约束是等号):
在这里插入图片描述
然后将t1和p放在一起,形成一个集合,另外还要将pts(t1)和pts§放在一起,形成一个集合,但是由于此处p是首次定义,所以pts§为空集。
继续分析下一句:

 在这里插入图片描述
写出约束,完善约束图:

在这里插入图片描述
看过我第一篇文章的话,这很容易理解,照葫芦画瓢而已。
下句tmp2=*q和上面步骤一样。 

在这里插入图片描述
在这里插入图片描述
继续分析下下句 

在这里插入图片描述
写出约束,完善约束图。(注意下面是等号,以红色为准)。

在这里插入图片描述
约束图变成: 

在这里插入图片描述
解释:此处就完全体现了两次合并集合了,由于pts(PB)=pts(tmp1),所以PB和tmp1需要合并,最后成了 

在这里插入图片描述

上面是第一个合并,第二次合并是pts(PB)pts(tmp1)的合并,即:

在这里插入图片描述
分析最后一句,也是同样简单的。 

在这里插入图片描述
发现即相当于想要pts(PA)=pts(tmp2),即想要PA和tmp2合并,以及他们的子集合并,但是已经合并了,所以无需更改。 

在这里插入图片描述
至此就已经分析完毕了。 

比较

在这里插入图片描述
从两种方法的约束定义可以看出来,Andersen是子集概念,Steensgaard是相等概念,反应到算法中就是直接粗暴合并。所以效率更高,损失精度。

时间复杂度: 

 

  • Steensgaard很快,几乎是线性。虽然有的时候合并会浪费一点时间,如上面的第9条指针语句,但是大多都很快,比如前4条指针语句,最后一条指针语句甚至没有任何改变。所以大概o(n),其中n是指针语句的个数。
  • Andersen较慢,对于一条语句就可能是o(n^2)了,由于有n条指针语句,o(n^3)。

在这里插入图片描述
例子:
在这里插入图片描述
如果是Steensgaard怎么做呢?其不会指向d,e,f。而是将y与a,b,c和并,复杂度为1,而前者是9(3*3)。 

 

以上就是指针分析的两个常用算法了,注意以上都是属于流不敏感的算法哦。

(ps:提供Steensgaard的论文给感兴趣的人阅读:Points-to analysis in almost linear time,或者自己去找这篇文章也能找到)。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值