前言

指针分析是一个非常复杂的工作,这些工作很多方向,比如是否是上下文敏感分析或上下文不敏感分析,显然,这难易度是不一样地。比如下图。对于同一段代码,敏感性分析如蓝色,不敏感分析如红色。

相比之下,不敏感分析不在乎语句的顺序,比如2,4两个语句换一下位置,得到的结果还是一样的,同时也不要求结果是否精确。
不敏感分析特点:安全。
即确保召回那个唯一正确的值就好,而不管精确不精确,是不是多了。
下面我们要讨论的就是不敏感分析。所以有些语句我们是不会管的,比如:

即,我们只管那些赋值的,和指针相关的语句。从而将此工作得到了大大简化。

Anderson’s pointer analysis

这个指针分析的算法很有名,是分析C语言的,但是思想都是通用的,下面开始介绍。

基础

Constraint type Assignment Constraint Meaning
Base Referencing ( a = &b ) a ⊇ {b} loc(b)∈pts(a)
Simple Aliasing ( a = b ) a ⊇ b pts(a) ⊇ ptrs(b)
Complex Dereferencing read ( a = *b ) a ⊇ *b ∀v∈pts(b). pts(a) ⊇ pts(v)
Complex Dereferencing write ( *a = b ) *a ⊇ b ∀v∈pts(a). pts(v) ⊇ pts(b)

解释:我们暂时先不看第一列和第三列,其他的应该很好理解。

  • loc(b)表示b的地址。
  • pts(a):point-to sets(a),表示a的可能指向集合,千万注意是可能指向,别忘了我们是做不敏感分析。即如果a=&b,a=&c,那么有pts(a)={loc(b),loc(c)}
  • ∈,⊇,这个和数学中集合的概念一致,就是属于和子集关系的意思。
  • 以第2行为例,有pts(a) ⊇ ptrs(b),为什么?举个例子你就明白了,如果有:a=&d,b=&c,a=b。那么pts(b)={loc(c)},pts(a)={loc(c),loc(d)}。所以明白了为什么pts(a)可能比pts(b)集合更大了吧,因为a=b把b的指向全部给了a,但是a可能还有其他的指向啊!

约束图

现在我们要做一些前期工作,并且要开始看上面那个表的第一列和第三列。举例来说,如果有代码:

p = &a;q = &b;*p = q;r = &c;s = p;t = *p;*s = r;

我们按照上面表的第3列翻译成下面,叫做约束:

p  ⊇ {a}, q  ⊇ {b}, *p ⊇ q, r ⊇ {c}, s ⊇ p, t ⊇ *p, *s ⊇ r

我们可以开始根据上面的表格创建初始约束图,其中基本(base)约束和(simple)约束是创建初始约束图的基础。初始约束图的创建分为如下三步:

  • 首先为程序中的每个变量建立一个节点
  • 后根据基本(base)约束标注节点的指向集
  • 每一个初始的简单约束(simple)建立一条有向边
    可以得到如下图:

    解释:正如名字,上面只是约束图,而且只是一个初始约束图,图中的边也并不是指针的指向关系,而是约束关系。拿上图的边edge(p,s)为例,其表示p所指向的,s都将指向。

实战

下面用一个例子来进行实战整个Anderson算法。


int i, j, k;
int *a = &i;int *b = &k;a = &j;int *p = &a;int *q = &b;p = q;int *c = *q;

可以得到如下的约束:

   a ⊇ {i, j}, b ⊇ {k}, p ⊇ {a}, q ⊇ {b}, p ⊇ q, c ⊇ *q

从而得到如下初始约束图:

上面的work_queue工作队列就是下面伪代码中的W。伪代码如下:
(我们已经完成了1,2步了)。

开始执行循环,从队列中取出a。
由于找不到关于a的复杂约束,复杂约束是什么?除了简单约束和基本约束就是复杂约束,具体可以参照开头的那个表格。
由于找不到a出发的边,所以此循环结束,如下。

取出b,
找不到关于b的复杂约束
找不到b出发的边
此循环结束,如下。

取出p,
找不到复杂约束
找不到p出发的边。
此循环结束,如下。

取出q,
找到复杂约束,c ⊇ *q。q的指向有b,从而加入边edge(b,c)。而且加入b到工作队列中。
找到q出发的边edge(q,p),所以pts§={a,b},由于pts§改变了,增加了一个元素,所以p再次加入到工作队列中。
此循环结束。

取出b,
没有复杂约束
找到b出发的边,所以pts©={k},由于pts©改变了,所以c加入到工作队列中。
此循环结束。

取出p,
没有复杂约束
没有从p出发的边
此循环结束。

取出c,
找到复杂约束c ⊇ *q,但是复杂约束的形式和算法中的不一样,所以for循环结束。
找不到c出发的边
此循环结束。

由于工作队列为空,此算法结束。
将旁边的那些集合比如{i,j}统统连上,即edge(a,i),edge(a,j)…。就变成了我们最终要的指针指向关系了。

这样我们就完成了指针分析。

Point-to Analysis指针分析(1)相关推荐

  1. Point-to Analysis指针分析(2)

    上一篇文章是Point-to Analysis指针分析(1) 下面介绍一种新的指针分析的算法Steensgaard算法,并将其与上一篇文章介绍的Andersen算法相比较. Steensgaard算法 ...

  2. 【软件分析/静态程序分析学习笔记】7.指针分析(Pointer Analysis)入门

    写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...

  3. 程序分析-基于SVF实现AnderSen指针分析算法

    指针分析 一.前言 1.1.指针分析 1.2.SVF 二.AnderSen算法 2.1.AnderSen算法约束 2.2.示例 2.2.1.将C语言源代码编译为SSA形式的LLVM IR 2.2.2. ...

  4. 指针分析-改进版Andersen算法(一)

    Wave Propagation and Deep Propagation for Pointer Analysis 一.背景 二.Wave Propagation 2.1.Wave Propagat ...

  5. Variant Analysis(变种分析)——使用已知漏洞发掘未知漏洞

    文章目录 前言 1.variant Analysis (变种分析)是什么? 从哪里开始 2.常用技术 2.1 控制流分析(Control flow analysis (CFA)) 2.2 数据流分析 ...

  6. python进行探索性数据分析EDA(Exploratory Data Analysis)分析

    python进行探索性数据分析EDA(Exploratory Data Analysis)分析 show holy respect to python community, for there ded ...

  7. 用户增长——Cohort Analysis 留存分析(三)

    数据是会骗人的,尤其是平均数据(真实世界会有用户每个月下单2.5次吗?很可能是两个分别下单1次和4次的客户而已),一个中等的平均的用户画像其实完全是用数据创造出来的虚幻的形象.而一个漂亮的平均数所创造 ...

  8. 如何利用NDI Analysis工具分析NDI流类型

    NDI Analysis工具分析NDI流类型 目前NDI产品主要分为两个类型,第一种Full NDI,如N3/N4/N30/N40.第二种是NDI|HX,如Kiloview E1 NDI/E2 NDI ...

  9. 【C】 36_函数与指针分析

    函数类型 C 语言中的函数都有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 int add(int i, int j) 的类型为 int(int, int) C 语言中通过 type ...

最新文章

  1. webp转换gif_右键转换文件格式
  2. php程序设计简明教程
  3. C# System.Drawing.SystemColors 系统颜色
  4. win95光盘版安装方法
  5. Java ques:java.lang.NoClassDefFoundError: org/junit/platform/engine/ConfigurationParameters
  6. oracle共有同义词,Oracle同义词概念
  7. 校友会2019中国大学计算机,校友会2019中国大学一流专业排名800强发布,北大清华复旦前三...
  8. 最适合养老的20座城市
  9. 如何解决python中文问题_布同:如何解决Python中文问题(总结了多位前人经验,初学者必看)...
  10. 【面试题】为什么需要 public static void main (String[ ] args) 这个方法?
  11. codeforces 696C C. PLEASE(概率+快速幂)
  12. 向Spring大佬低头--大量源码流出解析
  13. WampServer环境搭建
  14. 放大电路不同频段耦合电容、旁路电容、极间电容和分布电容的分析方法
  15. 【软件测试】离开“浪浪山“测试人迎来的春天......
  16. android一键清理任务,Android 一键清理、内存清理功能实现
  17. 联想开机启动项按哪个_联想笔记本按哪个按键进入U盘启动|详解联想进入U盘启动的教程...
  18. 第三名是最危险的名次
  19. 基于Python+django的 医院排队叫号系统-计算机毕业设计
  20. C#控件的创建、属性设置及事件注册

热门文章

  1. 算法——计算的灵魂(《算法》一本写了近40年的书)
  2. 人工智能十大流行算法
  3. 切歌请按3或4!我把树莓派装进了旋转电话里,现在它成了一部MP3
  4. 独家 | 综述:情感树库上语义组合的递归深层模型
  5. 独家 | R语言中K邻近算法的初学者指南:从菜鸟到大神(附代码&链接)
  6. 报名 | 计算机视觉讲座:师兄带你从菜鸟到实战!
  7. AI产业智能化白皮书 | 清华x百度:全面解读AI产业化的现在和未来(附下载)...
  8. 教你用百度地图API抓取建筑物周边位置、房价信息(附代码)
  9. Python下载文件的11种方式
  10. 【CVPR2021】旷视研究院入选学术成果盘点