指针分析 Pointer Analysis

本文主要参考Pointer Analysis

啥是指针分析

这里要区分指针分析(Pointer Analysis)和别名分析(Alias Analysis),指针分析也是别名分析的基础。

  • 指针分析:分析指针所有可能指向的对象。
  • 别名分析:分析两个指针是否指向相同的对象,可通过指针分析来推导得到。
 int x;
 int* p = &x;
 int* q = p;

指针分析可以得到p和q指向x,进一步*p、*q和x互为别名。

为啥要指针分析

指针的应用非常广泛,看几个例子。

CASE1:

*p = a + b;
 y = a + b;

在可用表达式分析中,p若指向a或者b,则第二个a+b则不是冗余的。

CASE2:

x = 3; *p = 4; y = x;

常量传播分析中,y是否是常量取决于p的指向。

如何进行指针分析

指针分析是一类特殊的数据流问题,它是其它静态程序分析的基础,但指针使用的灵活性导致了指针分析的复杂性,实际上指针分析是一个不可判定问题,所以实际的指针分析算法都是近似且保守的,须在效率和精度之间进行折衷。
指针分析研究的内容主要集中在分析精度和时空开销之间的取舍,精度方面,主要指流敏感性(flow-sensitivity)和上下文敏感性(context-sensitivity),一般而言,流敏感分析方法的精度明显好于流不敏感的分析方法,在上下文敏感性上也有同样的特点。流不敏感的指针分析普遍使用在开源或者产品级高级编译器中,其中主要有两类:基于包含(inclusion-based)的指针分析和基于合并(unification-based)的指针分析。
基于包含的指针分析是一种基于约束集(constraint set)求解的流不敏感的指针分析方法,该指针分析又称为基于子集(subset-based)的指针分析或者基于约束的(constraint-based)的指针分析,在指针分析领域后来也被称之为Anderson风格的指针分析。其算法的时间复杂度为O(n3)。

注:上述内容引用自《陈聪明, 霍玮, 于洪涛,等. 基于包含的指针分析优化技术综述[J]. 计算机学报, 2011, 34(7):001224-1238.》

这里介绍的方法是Anderson’s pointer analysis。Anderson的指针分析算法是一种基于约束基于子集(subset-based)的方法。

如下例子的约束关系:

Anderson的指针分析采用WorkQueue的方法。


以上例子,根据该算法可以得到:
在这里插入图片描述

参考

  • [1] https://blog.csdn.net/dashuniuniu/article/details/78704741
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值