南京大学【软件分析】08 Pointer Analysis

1. Motivation

CHA存在不精确的问题。对于下面的例子,n的声明类型为Number,使用CHA分析,那么n.get()会返回三个目标函数,分别是Zero.get One.get Two.get,这就导致x的接收了0 1 2三个不同的值,x最终为非常量NAC。但实际上我们期望调用One.get,得到返回值1。
因此引入指针分析,使n指向new One,解决这种CHA引入了很多假的调用边的问题。
在这里插入图片描述

2. Introduction to Pointer Analysis

指针分析是基础的静态分析,明确了程序中的指针可以指向哪些内存的地址,计算一个指针(variable或filed)可以指向哪些对象。
指针分析是一个may- analysis,是过近似的over-approximation
在这里插入图片描述
指针分析Pointer analysis:程序中的指针会指向哪些对象?
别名分析Alias analysis:两个指针可以指向同一个对象吗?

3. Key Factors of Pointer Analysis

影响指针分析精度和效率的因素有一下四种,这四个因素分别回答了对应的问题。
这里主要介绍红色部分
在这里插入图片描述

3.1 Heap Abstraction

在动态执行中,由于循环结构的存在,堆对象的数量是无限的。因此,在静态分析时,堆抽象Heap Abstraction把具体的对象抽象成有穷的抽象对象(把同类对象合并 )。
在这里插入图片描述
堆抽象主要分两大流派:Store based model和Storeless model,这里主要介绍Store based model中的Allocation sites在这里插入图片描述
Allocation sites创建点:是堆抽象中最常用的技术。它指的是把在同一个创建点创建的对象都归为一类。即程序中有几个new语句,就有几个对象,这种方法抽象出来的对象肯定是有限的,因为程序是有限的。下面对象的下标表示代码行数
在这里插入图片描述

3.2 Context Sensitivity

上下文敏感:更精确。每一个函数在被调用的时候,考虑被调用时的上下文。为每一个调用点都创建一个上下文
上下文不敏感:不同的调用点使用同一个上下文,每一个函数只分析一次
下面的例子,左侧为上下文敏感的结果,右侧为上下文不敏感的结果
在这里插入图片描述

3.3 Flow sensitivity

流敏感Flow sensitivity:更精确,开销大。考虑语句的执行允许
流不敏感Flow insensitivity:忽略控制流的顺序,把程序当作一堆语句的无序集合。下面的例子中流不敏感存在误报
下面的例子,左侧为流敏感的结果,右侧为流不敏感的结果
在这里插入图片描述

3.4 Analysis scope

Analysis scope:明确了在做指针分析时,应分析程序中的哪些部分。
Whole-program:分析程序中所有指针的指向关系,分析一次可以获得所有的指向关系
Demand-driven:根据特定需求,只分析需求的指针分析,适用于有特定需求的指针分析
下面的例子,左侧为Whole-program的结果,右侧为Demand-driven(只考虑第五行)的结果
在这里插入图片描述

4. Concerned Statements

指针分析只关注影响指针的语句pointer-affecting statements
java当中的指针:

  • Local variable: x
  • Static field: C.f。很多文献称其为global variable,类似于Local variable的处理
  • Instance field: x.f。把它建模成一个对象(pointed by x)携带一个域 f
  • Array element: array[i]。静态分析忽略下标,把数组建模成只有一个filed的对象,并把这个filed称为arr,此时它的处理类似于Instance field。

在这里插入图片描述

指针分析中关心的五种语句pointer-affecting statements:(对于复杂的a.b.c.d引入临时变量分解成三地址码)

其中前四种较为简单,不涉及方法调用。
第四种涉及到方法调用,这里关注最复杂的Virtual call
在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值