视频:南京大学《软件分析》课程10(Pointer Analysis - Foundations II)哔哩哔哩_bilibili
课程主页:Static Program Analysis | Tai-e (pascal-lab.net)
笔记参考:【课程笔记】南大软件分析课程8——指针分析-上下文敏感(课时11/12) - 简书 (jianshu.com)
(34条消息) 【课程笔记】南大软件分析课程—16课时完整版_bsauce的博客-CSDN博客_南京大学软件分析
PPT:Pointer Analysis: Context Sensitivity (nju.edu.cn)
上下文不敏感带来的问题
对于上述这段代码,当我们不考虑上下文去处理第 5、6 行的 id 函数调用的时候,id 的参数和返回值会和两次调用的参数和返回值杂糅在一起,这样假如在进行常量传播的时候,变量 i 就会被分析为 NAC,这是不对的。所以要对函数调用添加上下文,这样去分析第 7 行的时候 get 指向的就只有对象 One 里面的 get 函数
Introduction
btw 上下文不敏感的英文是 contex insensitivity,缩写是 C.I. 上下文敏感的英文是 contex sensitivity,缩写是 C.S.
- 目前 oldest 和 best-know 的上下文敏感策略是 call-site sensitivity(call-string)
- 使用 call site 链来表示每个方法的上下文(非重点)
- cloning-based 上下文敏感(最直观的方法去实现上下文敏感)、
- 每个上下文就会对变量和方法进行一次克隆
- 上下文敏感的堆
-
OO 程序是典型的堆敏感,因为程序会频繁的修改堆,所以也要对堆抽象添加上下文
-
老师在这里进行举例表示上下文敏感和堆的上下文敏感缺一不可
-
不考虑堆的上下文敏感,只考虑分析的上下文敏感
- 我们可以看到虽然分析的时候考虑了上下文敏感,但是当调用方法中存在 new 语句的时候 (堆操作),不考虑堆的 C.S.就会像左图一样
-
考虑堆的上下文敏感,不考虑分析的上下文敏感
- 当分析的时候不考虑上下文敏感,只考虑对的上下文敏感,如左图所示,在变量 p 处就出现了错误,随后导致 o_8. f 指向 o 1 和 o 2,即使堆上下文敏感也没用。
-
Context Sensitive Pointer Analysis:Rules
就是在之前的规则上面增加了标记
- 根据调用者的行数来区分不同上下文,只要区分了函数、变量、堆对象,就能够区分实例域、上下文敏感的指针(变量+对象域)。
C:上下文(暂时用调用点的行数表示),O:对象,F:对象中的域。
Call 规则有所改变
- select (c, l, c’: oi, m)根据调用时的信息来给调用目标函数选择上下文(c 是调用者的上下文,l 是调用者的行号,c’: oi 是 x 对象的指向集合,m 是目标函数),ct 表示目标函数的上下文(后面会将如何 Select 如何选择上下文)。c 是可以累积的,一连串的调用,上下文将用一连串的行数来表示。