南大《软件分析》8.0 Pointer Analysis
课程环境:https://tai-e.pascal-lab.net/lectures.html
课程视频:https://www.bilibili.com/video/BV1b7411K7P4
南大《软件分析》8.0 Pointer Analysis
首先强调一下这一部分是整个静态分析的重中之重,也是基础中的基础,所以也就意味着这一部分的知识需要认真学习。先通过一个例子来引出指针分析:
对于上面的例子,如果采用前一部分 CHA 的知识,最后得到的结果是 x = NAC,原因是 CHA 会找到其子类 Zero,one,two 分别返回的是三个不同的值,根据前面常量传播的知识,可知最后的结果为 x = NAC。但是如果这里引入指针分析(暂且先不管是什么)就可以得到一个更精确的结果即 x = 1。
Introduction to Pointer Analysis
这里分别给出了指针分析的作用,研究的对象,属于的范畴(may or must analysis)。
上图通过一个例子说明了指针分析就是将整个程序作为输入,并且最后输出的结果是变量和对象之间的对应关系。
同时,这里需要对指针分析和别名分析做一个区分,这两者研究的对象并不相同,但是值得注意的是别名信息可以从指针分析的结果中得到。
指针分析的应用
Key Factors of Pointer Analysis
指针分析是一个相对复杂的系统,有多个因素影响系统的精度和效率,上图分别列举了四个方面,并指出了对应的问题,且给出了对应的解决方案,在这节课中会对部分比较重要的 choice 进行讲解。
Heap Abstraction
在动态执行的过程中,由于递归或者循环的存在使得堆块的数量可以是不受限制的(即使一个堆块被分配之后又释放了也包括在内),所以需要通过对堆进行一个抽象,使得其在抽象之后的堆块数量是有限的,方便来分析问题,在这里所采用的方法就是以分配点为单位(allocation site)代表一个抽象的堆块。
Context Sensitivity
上下文敏感关注的是如何对 calling context 的处理,是根据每个调用点分开分析,还是作为一个整体进行分析。
Flow Sensitivity
Flow-insensitive 忽视了控制流顺序,并且对整个程序只维持一张 map(如上图橙色部分所示)。
Analysis Scope
Concerned Statements
java中的几类指针:
- Local variable: x
- Static field: C.f
- Instance field: x.f
- Array element: array[i]
需要关注的是对于最后一类指针数组的简化,在指针分析中忽视其数组索引,使用一个简单的 field 代替即可,具体如下:
再知道 java 中的几类指针之后,还需要关注那些可以改变这些指针值的语句,具体如下:
思考题
- 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.