Anderson‘s pointer analysis

article/2025/10/22 23:40:11

本文是垃圾文章,请直接学习其它资料

  • 南京大学《软件分析》课程08(Pointer Analysis)
  • https://www.cs.cmu.edu/~aldrich/courses/15-819O-13sp/resources/pointer.pdf

指针分析

指针分析是一类特殊的数据流问题,它是其它静态程序分析的基础,但指针使用的灵活性导致了指针分析的复杂性,实际上指针分析是一个不可判定问题,所以实际的指针分析算法都是近似且保守的,须在效率和精度之间进行折衷

指针分析研究的内容主要集中在分析精度和时空开销之间的取舍,精度方面,主要指流敏感性(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的指针分析算法是一种基于约束(constraint-based)或者说基于子集(subset-based)的方法,根据程序中语句建立变量与变量,或者变量与内存之间的约束关系。Anderson的方法分为两步,约束收集(或者说约束生成,constraint generation)和约束求解(constraint resolution)。

约束生成

约束类型分为三种,基本约束,简单约束,复杂约束,并有如下四种具体形式。

Constraint typeAssignmentConstraintMeaning
BaseReferencing ( a = &b )a ⊇ {b}loc(b)∈pts(a)
SimpleAliasing ( a = b )a ⊇ bpts(a) ⊇ ptrs(b)
ComplexDereferencing read ( a = *b )a ⊇ *b∀v∈pts(b). pts(a) ⊇ pts(v)
ComplexDereferencing write ( *a = b )*a ⊇ b∀v∈pts(a). pts(v) ⊇ pts(b)

注:上图中的 loc(b) 表示 b 的地址, pts(a) 表示 a 可能指向的内存的集合

该方法按照以上四种约束形式收集程序中的约束,如下代码实例:

// code sample1
p = &a;// p  ⊇ {a}
q = &b;// p  ⊇ {a}, q  ⊇ {b}
*p = q;// p  ⊇ {a}, q  ⊇ {b}, *p = q
r = &c;// p  ⊇ {a}, q  ⊇ {b}, *p = q, r ⊇ {c}      
s = p;// p  ⊇ {a}, q  ⊇ {b}, *p = q, r ⊇ {c}, s ⊇ p
t = *p;// p  ⊇ {a}, q  ⊇ {b}, *p = q, r ⊇ {c}, s ⊇ p, t ⊇ *p
*s = r;// p  ⊇ {a}, q  ⊇ {b}, *p = q, r ⊇ {c}, s ⊇ p, t ⊇ *p, *s ⊇ r

约束图(constraint graph)

约束图 G = <Var, E>,图中的节点为变量或者抽象的内存区域,每一个节点都关联一个对应的point-to sets。 a->b ∈ E,当且仅当如下三种情况之一成立:

  • pts( a ) ⊆ pts( b ) :{ 基本约束 }
  • apts( v ) and pts( *v ) ⊆ pts( b ) : {复杂约束}
  • pts( a ) ⊆ pts( *v ) and bpts( v ):{复杂约束}

注:约束图表示的是约束关系,不是指向关系,这一点要搞清楚

约束图边的添加分为两种,

  • 一是在生成约束信息的时候,根据 基本约束 直接添加的边
  • 一是在约束求解的过程中,根据 复杂约束 进行“推导”添加的边

对于代码示例1,约束信息收集完时的约束图如图-1所示,该图称之为初始约束图,基本约束简单约束是创建初始约束图的基础。初始约束图的创建分为如下三步:

  • 首先为程序中的每个 变量建立一个节点
  • 后根据基本约束标注节点的 指向集
  • 每一个初始的简单约束建立一条有向边
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/42f4b33738fac7dc447e3d4c095e3434.png)
图-1 Constraint Graph
*注:图中的边也可以理解成 **source node 的 point-to information 需要传递到 destination node** ,例如图中的p->s,表示p指向的内存区域,s也应该指向。所以我们需要将p节点的point-to information传播到s节点。*

对于第二种边,我们不能从约束信息中直接获得,需要对complex constraints进行“推导”才能获得。complex constraint会产生新的base constraint。我们的最终目的不是获得约束图,而是在创建约束图的过程中将 point-to information 进行正确的“传递”。这些point-to information 按照下面的原则进行传播。

如果 locpts( a ) 并 ( a->bE),那么我们就可以得到( locpts( b ))。

Anderson算法

采用的是一个工作队列算法(workque algorithm),该算法我直接从[2]中摘抄过来,如图-2所示。

Anderson's algorithm

注:更完善的算法见[1]

上述算法中我们有两点需要注意:

  1. 边的添加。边的添加有两种情况,分别是apts( v ) and pts( v ) ⊆ pts( b )pts( a ) ⊆ pts( v ) and bpts( v ),这两个都是复杂约束**。
  2. point-to information的传播。point-to information才是我们最终欲得到的信息。

关于代码实现《指针分析/Point-to Analysis/Reference Analysis》有一个比较初级的实现,这里我就不贴代码了,该博客也有关于算法的示意图。

我这里使用另外一个代码示例[4]来说明整个算法过程,如下所示。

// code sample 2
int i, j, k;
int *a = &i;// a ⊇ {i}
int *b = &k;// a ⊇ {i}, b ⊇ {k}
a = &j;// a ⊇ {i, j}, b ⊇ {k}
int **p = &a;// a ⊇ {i, j}, b ⊇ {k}, p ⊇ {a}
int **q = &b;// a ⊇ {i, j}, b ⊇ {k}, p ⊇ {a}, q ⊇ {b}
p = q;// a ⊇ {i, j}, b ⊇ {k}, p ⊇ {a}, q ⊇ {b}, p ⊇ q
int *c = *q;// a ⊇ {i, j}, b ⊇ {k}, p ⊇ {a}, q ⊇ {b}, p ⊇ q, c ⊇ *q

将Anderson`s algorithm应用到上述代码的整个过程如图-3所示。最后按照约束图中节点的point-to sets,按照指向关系,构建内存指向图。
在这里插入图片描述
在这里插入图片描述

图-3 代码示例2初始约束图
*注:最后一幅图中红色线条表示内存的指向关系*

当算法迭代终止的时候,我们根据约束图中节点的point-to sets,建立各个节点间的指向关系,如最后一幅图所示。

未来工作
Anderson’s algorithm优化
llvm-2.4 Andersons.cpp源码分析
clang static analyzer中Anderson’s pointer analysis实现

[1]. 陈聪明, 霍玮, 于洪涛,等. 基于包含的指针分析优化技术综述[J]. 计算机学报, 2011, 34(7):001224-1238.
[2]. Pointer Analysis. CS252r Spring 2011
[3]. Andersen L. Program analysis and specialization for the C programming language[J]. Addison-Wesley Series in Computer Science, 1994, 2(1):37 - 77.
[4]. 指针分析/Point-to Analysis/Reference Analysis
[5]. #63 Andersen’s Points to Analysis


http://chatgpt.dhexx.cn/article/yr8KbS7v.shtml

相关文章

iOS围绕某点缩放或旋转的AnchorPoint的设定

经常会遇到需求&#xff0c;要求手势的缩放或者旋转操作&#xff0c;要求动作变化围绕某一个特定点&#xff0c;或者是两指的中心点&#xff0c;或者是某一个点。 这个问题首先要清晰的知道&#xff0c;iOS各个view的层次关系。特别是&#xff0c;要清除的知道&#xff0c;当前…

彻底理解CALayer的position与anchorPoint

引言 相信初接触到CALayer的人都会遇到以下几个问题&#xff1a; 为什么修改anchorPoint会移动layer的位置&#xff1f; CALayer的position点是哪一点呢? anchorPoint与position有什么关系&#xff1f; 我也迷惑过&#xff0c;找过网上的教程&#xff0c;大部分都是复制粘…

position和anchorPoint

本人录制技术视频地址&#xff1a; https://edu.csdn.net/lecturer/1899 欢迎观看。 一、理论概述 1.简单介绍 CALayer有2个非常重要的属性&#xff1a;position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) prop…

Ant Design - Anchor

Anchor锚点 此组件的属性有以下几点&#xff1a; 现在给出一份例子 其他属性都很简单就不多说了&#xff0c;主要我遇到的麻烦是 getContainer 属性 锚点是默认body滚动的&#xff0c;所以如果你滚动的区域是body就会看到锚点的小蓝点是会随内容滚动的&#xff0c;但是如果你…

Anchor Point

On default, CCNode’s anchor point is (0, 0), which is at the left-bottom point. CCSprite’s anchor point is (0.5, 0.5), which is at the center. 如果你把一个CCSprite作为child加入到CCNode中&#xff0c;CCNode的anchor point不会对sprite的位置有影响&#xff0c;…

【Cocos2d-x 3.0学习笔记】 AnchorPoint 和Position 关系

先不多说&#xff0c;上两张图片&#xff1a; 解释一下上面图片的意思&#xff1a; 描点就是图片中红点的位置。setAnchorPoint的取值范围0&#xff5e;1&#xff0c;距离设置的是一张图片 setAnchorPoint(Point(0,0))表示在图片左下角, setAnchorPoint(Point(1,1))表示在图片…

iOS开发之layer.frame,layer.anchorPoint,layer.position对frame的影响

最近遇到相关的问题&#xff0c;所以就将这三个属性值&#xff0c;进行了分析和研究&#xff0c;话不多说&#xff0c;直接上代码了&#xff0c;详细的文字描述都在代码中&#xff0c;可以自行查看。 之前还写了一篇文章&#xff0c;也可以同时查看一下&#xff1a; iOS开发之…

anchorPoint

OS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性&#xff1a;position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) property CGPoint anchorPoint; 称为“定位点”、“…

iOS动画小课堂:定点缩放弹窗(利用锚点anchorPoint进行实现)包含完整demo

文章目录 前言I 基础知识 (CALayer)1.1 anchorPoint1.2 positionII iOS开发中常用的动画(定点缩放弹窗)2.1 核心代码2.2 完整demo源码see also前言 iOS开发中常用的动画(定点缩放弹窗)的应用场景: 会员详情的右侧下拉操作菜单 浏览器的右侧下拉菜单

UIView的bounds、frame、center/position、anchorPoint的关系

视图的frame&#xff0c;bounds和center属性仅仅是存取方法&#xff0c;当操纵视图的frame&#xff0c;实际上是在改变位于视图下方CALayer的frame&#xff0c;不能够独立于图层之外改变视图的frame。 对于视图或者图层来说&#xff0c;frame并不是一个非常清晰的属性&#xff…

彻底理解position与anchorPoint

原文 http://www.cnblogs.com/benbenzhu/p/3615516.html 引言 相信初接触到CALayer的人都会遇到以下几个问题&#xff1a; 为什么修改anchorPoint会移动layer的位置&#xff1f; CALayer的position点是哪一点呢? anchorPoint与position有什么关系&#xff1f; 我也迷惑过&…

彻底弄清 anchorPoint 和 position

最近在研读《iOS Core Animation Advanced Techniques》这一本书&#xff0c;想系统地学习下关于 CALayer、Transition、以及动画等知识点。大家可以在 gitbook 上面找到该书的翻译版本。 传送门 在读到图层几何学这一章的时候&#xff0c;了解到了两个概念&#xff1a;anc…

Cocos2dx学习笔记9:cocos2dx锚点(Anchor Point)

锚点(AnchorPoint)是相对坐标&#xff0c;通常用来定义物体内部的点&#xff0c;在cocos2dx中&#xff0c;一般都是以加载精灵来实现游戏元素的表现&#xff0c;而精灵一般都是对应的一张图片资源。 我们在设置精灵位置的时候&#xff0c;要设置精灵中的锚点来和我们的坐标点相…

Anchorpoints学习笔记:

Anchor Detr学习笔记&#xff1a; 文章目录 Anchor Detr学习笔记&#xff1a;1.首先介绍下什么叫锚点&#xff08;Anchor point&#xff09;2.再来介绍下什么叫DETR3.Anchor Detr 1.首先介绍下什么叫锚点&#xff08;Anchor point&#xff09; ​   Anchor point就类似一张钉…

数学篇(三)向量的基本运算

1.平面向量 1.1平面向量的加法运算 两个向量&#xff0c;&#xff1b; 向量满足四边形法则&#xff1b; 1.2平面向量的乘法运算 两个向量&#xff0c;&#xff1b; 向量乘表示为 ; 相比于向量加运算&#xff0c;向量乘运算要复杂点&#xff0c;很难看明白向量乘的几何意…

2. 数据类型、向量、向量索引、向量修改、向量运算

b站课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99元&#x1f622;&#x1f622;买了&#xff0c;感觉不错&#xff09;&#xff1a;https://ke.qq.com/course/3707827#term_id103855009 &a…

matlab 向量的基本运算

本文主要参考&#xff1a;王沫然编著的MATLAB与科学计算&#xff08;第2版&#xff09; 博客文章&#xff1a;点击打开链接 1、向量生成 1.1、直接输入 1.2、 xx0:step:xn 1.3、线性等分向量—linespace 1.4、对数等分向量—logspace 2、向量运算 21、加&#xff08;减&#x…

向量复习(一):定义、求解、四则运算、点积和叉积

向量复习&#xff08;一&#xff09; 1. 向量的定义2. 向量的表示3. 向量的求解4. 向量的四则运算4.1 加法4.2 减法4.3 乘法和除法 5. 点积和叉积5.1 点积5.2 叉积 6. 模的求解7. 附录&#xff1a;代码8. 免责声明 首先&#xff0c;我们先来复习一下二维空间几何求交涉及的向量…

向量的基本运算专题

关于向量 高中数学必修 4 4 4说: 几何向量是线性空间中有大小与方向的量。 放图理解一下&#xff1a; 如上图所示&#xff0c;向量可以形象的用一根箭头表示。箭头所指代表向量的方向&#xff0c;线段的长度代表向量的大小。 在 O I OI OI中&#xff0c;我们简化了一下向量的…

向量加减法

常用向量&#xff1a; 2D向量 v < x , y > 3D向量 v < x , y , z > 4D向量 v < x , y , z , w > (也称作齐次坐标) 向量加减法&#xff0c;各维度都是类似的。 向量加法&#xff1a; 向量加法的和就是以两个向量的边作为平行四边形长边的对角线表示 …