南大《软件分析》8.0 Pointer Analysis

南大《软件分析》8.0 Pointer Analysis

henry Lv4

课程环境:https://tai-e.pascal-lab.net/lectures.html

课程视频:https://www.bilibili.com/video/BV1b7411K7P4

南大《软件分析》8.0 Pointer Analysis

首先强调一下这一部分是整个静态分析的重中之重,也是基础中的基础,所以也就意味着这一部分的知识需要认真学习。先通过一个例子来引出指针分析:

nipaste_2024-08-27_00-34-5

对于上面的例子,如果采用前一部分 CHA 的知识,最后得到的结果是 x = NAC,原因是 CHA 会找到其子类 Zero,one,two 分别返回的是三个不同的值,根据前面常量传播的知识,可知最后的结果为 x = NAC。但是如果这里引入指针分析(暂且先不管是什么)就可以得到一个更精确的结果即 x = 1。

Introduction to Pointer Analysis

nipaste_2024-08-27_00-41-0

这里分别给出了指针分析的作用,研究的对象,属于的范畴(may or must analysis)。

nipaste_2024-08-27_00-43-4

上图通过一个例子说明了指针分析就是将整个程序作为输入,并且最后输出的结果是变量和对象之间的对应关系。

nipaste_2024-08-27_00-45-2

同时,这里需要对指针分析和别名分析做一个区分,这两者研究的对象并不相同,但是值得注意的是别名信息可以从指针分析的结果中得到。

指针分析的应用

nipaste_2024-08-27_00-47-4

Key Factors of Pointer Analysis

nipaste_2024-08-27_00-50-0

指针分析是一个相对复杂的系统,有多个因素影响系统的精度和效率,上图分别列举了四个方面,并指出了对应的问题,且给出了对应的解决方案,在这节课中会对部分比较重要的 choice 进行讲解。

Heap Abstraction

nipaste_2024-08-27_00-52-3

在动态执行的过程中,由于递归或者循环的存在使得堆块的数量可以是不受限制的(即使一个堆块被分配之后又释放了也包括在内),所以需要通过对堆进行一个抽象,使得其在抽象之后的堆块数量是有限的,方便来分析问题,在这里所采用的方法就是以分配点为单位(allocation site)代表一个抽象的堆块。

nipaste_2024-08-27_00-56-4

Context Sensitivity

nipaste_2024-08-27_00-57-5

上下文敏感关注的是如何对 calling context 的处理,是根据每个调用点分开分析,还是作为一个整体进行分析。

Flow Sensitivity

nipaste_2024-08-27_01-00-4

Flow-insensitive 忽视了控制流顺序,并且对整个程序只维持一张 map(如上图橙色部分所示)。

Analysis Scope

nipaste_2024-08-27_01-02-2

Concerned Statements

java中的几类指针:

  • Local variable: x
  • Static field: C.f
  • Instance field: x.f
  • Array element: array[i]

需要关注的是对于最后一类指针数组的简化,在指针分析中忽视其数组索引,使用一个简单的 field 代替即可,具体如下:

nipaste_2024-08-27_01-07-1

再知道 java 中的几类指针之后,还需要关注那些可以改变这些指针值的语句,具体如下:

nipaste_2024-08-27_01-08-4

思考题

nipaste_2024-08-27_01-09-2

  • Title: 南大《软件分析》8.0 Pointer Analysis
  • Author: henry
  • Created at : 2024-08-27 01:20:50
  • Updated at : 2024-08-27 01:26:27
  • Link: https://henrymartin262.github.io/2024/08/27/8.0_Pointer_Analysis/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments