视频:南京大学《软件分析》课程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.的算法本质上没有什么区别,基本上就是把对象、变量前加了上下文的标识 image.png 唯一的区别在于 ProcessCall 中添加了 select 方法来找到目标函数 m 的上下文标识。 image.png

select 方法的细节在后面详细讲。

Context Sensitivity Variants

上下文的生成主要有三种策略:

  • call-site sensitivity
  • object sensitivity
  • type sensitivity

call-site sensitivity

image.png call-site sensitivity 的策略如上图所示,就是在原来上下文链的基础上,把调用点处的上下文加上去。 下图是例子。但是这样的分析策略带来了一个问题,就是图中 15 行,bar 方法内又调用自己,那么这样分析就不会终止,就会生成一个无穷无尽的上下文链。并且在实际分析程序中,即使没有想图中这样的情况,但是因为程序本身就很复杂,生成的上下文链也会很长,这样就会影响分析性能。 image.png 所以,call-site sensitivity 设定了上下文链的长度最长为 k,因此它又被称为 k-CFA。 设置了长度限制可以

  • 确保指针分析算法的终止
  • 避免在实际分析中生成过长的上下文链

具体的操作就是对于生成的上下文链,如果长度大于 k,那么就只保留最后 k 个上下文。(在实际分析中,k 通常小于等于 3,并且在函数的上下文通常取2,堆上下文通常取1 的时候效果比较好) image.png 这里老师举了个例子,还是挺绕的,建议去看看视频

object sensitivity

image.png 基于对象的上下文敏感就是不适用行号作为上下文,而是用 receive object 作为上下文敏感链。 举例:image.png 如上图所示,1-object 的 object sensitivity。这样的优势是什么呢,如下图所示: image.png image.png call-site 的 sensitivity 在 12 行处汇聚了 5 和 6 行调用点的数据流,出现了错误。但是用 2-call-site 的 call-site sensitivity 可以解决这个问题。 但其实 call-site 上下文敏感和 object 上下文敏感半斤八两,如下图所示 image.png 理论上他们两个没啥可比性,但是在实践中对于 OO 语言,object sensitivity 无论是精准度还是性能都优于 call-site sensitivity 最后老师还讲了一个类型上下文敏感,基于创建点所在的类型,是基于对象敏感粗粒度的抽象,精度较低。是对 object sensitivity 的抽象,精度要弱于 object。