视频:南京大学《软件分析》课程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)
本节讲上下文敏感的过程间指针分析的算法
Context Sensitive Pointer Analysis:Algorithms
C.S.和 C.I.的算法本质上没有什么区别,基本上就是把对象、变量前加了上下文的标识
唯一的区别在于 ProcessCall 中添加了 select 方法来找到目标函数 m 的上下文标识。
select 方法的细节在后面详细讲。
Context Sensitivity Variants
上下文的生成主要有三种策略:
- call-site sensitivity
- object sensitivity
- type sensitivity
call-site sensitivity
call-site sensitivity 的策略如上图所示,就是在原来上下文链的基础上,把调用点处的上下文加上去。
下图是例子。但是这样的分析策略带来了一个问题,就是图中 15 行,bar 方法内又调用自己,那么这样分析就不会终止,就会生成一个无穷无尽的上下文链。并且在实际分析程序中,即使没有想图中这样的情况,但是因为程序本身就很复杂,生成的上下文链也会很长,这样就会影响分析性能。
所以,call-site sensitivity 设定了上下文链的长度最长为 k,因此它又被称为 k-CFA。
设置了长度限制可以
- 确保指针分析算法的终止
- 避免在实际分析中生成过长的上下文链
具体的操作就是对于生成的上下文链,如果长度大于 k,那么就只保留最后 k 个上下文。(在实际分析中,k 通常小于等于 3,并且在函数的上下文通常取2,堆上下文通常取1 的时候效果比较好)
这里老师举了个例子,还是挺绕的,建议去看看视频
object sensitivity
基于对象的上下文敏感就是不适用行号作为上下文,而是用 receive object 作为上下文敏感链。
举例:
如上图所示,1-object 的 object sensitivity。这样的优势是什么呢,如下图所示:
call-site 的 sensitivity 在 12 行处汇聚了 5 和 6 行调用点的数据流,出现了错误。但是用 2-call-site 的 call-site sensitivity 可以解决这个问题。
但其实 call-site 上下文敏感和 object 上下文敏感半斤八两,如下图所示
理论上他们两个没啥可比性,但是在实践中对于 OO 语言,object sensitivity 无论是精准度还是性能都优于 call-site sensitivity
最后老师还讲了一个类型上下文敏感,基于创建点所在的类型,是基于对象敏感粗粒度的抽象,精度较低。是对 object sensitivity 的抽象,精度要弱于 object。