视频:南京大学《软件分析》课程09(Pointer Analysis - Foundations I)哔哩哔哩_bilibili 课程主页:Static Program Analysis | Tai-e (pascal-lab.net) 笔记参考:(34条消息) 【课程笔记】南大软件分析课程—16课时完整版_bsauce的博客-CSDN博客_南京大学软件分析 软件分析 - 知乎 (zhihu.com) PPT: Pointer Analysis: Foundations (nju.edu.cn)
1指针分析规则
首先确定分析域和记号的表示
变量、函数、对象、实例域、指针、指向关系
针对上节课末尾提到的四种句子进行分析
横线上的是前提条件,横线下的是结论
2 如何实现指针分析
本质上指针分析就是要将指针关系通过指针(variables&fields)进行传播 关键在于当 pt (x) 发生改变,将改变的部分传播到 x 相关的指针。 用图来解决如何传播的问题
PFG Pointer Flow Graph 指针流图
程序的指针流图是一个有向图,它表示对象如何在程序中的指针之间流动。
- Nodes:指针,A node n represents a variable or a field of an abstract object
- Edges:An edge 𝑥 → 𝑦 means that the objects pointed by pointer 𝑥 may flow to (and also be pointed to by) pointer y
基于程序语句和相应的规则往 PFG 中添加边
基于 PFG,指针分析可以通过计算 PFG 的传递闭包来解决,如下图:基于 PFG,语句 j 可以从结点 b 沿着路径 b、a、oi. f、e 来传播
综上,指针分许分为两步
- 构建 PFG
- 基于 PFG 传播指向关系信息
这两步互相依赖,相辅相成。传播指向信息需要基于构建好的 PFG,在传播指向信息的同时 PFG 也在动态更新。
3 指针分析的算法
- WL 包含了等待处理的指向关系,其中的元素是指针 n 和指向关系集合 pts,<n,pts>,表示 pts 应该被添加到 pt (n) 中。
AddEdge
AddEdge (s, t) 是将 s->t 这条边加到 PFG 中:
- 当 PFG 中没有 s->t 时,将这条边加入 PFG 中
- 如果 s 的指向关系(pt (s))不为空,那么就需要将 s 的指向关系传播到 t,所以在 WL 中添加<t,pt(s)>
Propagate
Propagate (n, pts) 是将 pts 添加到 n 的指向关系中:
- 如果 pts 不为空,那么就将 pts 和 pt (n) 合并
- 然后将 pts 传播到结点 n 可以指向的所有结点中
Main Algorithms
- 首先初始化算法,WL 和 PFG 为空,并处理所有的 new 语句
- 处理所有的 assign 语句
- 处理 WL 中的条目
- 取出<n, pts>,进行去重操作,避免冗余,将去重后的指向关系向 n 传播
- 当 n 表示一个变量,那么可能需要去处理 store 和 load 指令
- 如果变量 x 有 store 指令,则添加一条边 y 指向变量 x 指向的 oi 的 field
- 最开始有点奇怪那个把 oi 从 $\Delta$ 取出来的操作,是因为已经执行过 propagate 了,此时变量 x 新指向的就是 $\Delta$,所以 $\Delta$ 就是 x,x 就是 $\Delta$
- 如果变量 x 有 load 指令,则添加一条边 oi 的 field 指向 y
- 如果变量 x 有 store 指令,则添加一条边 y 指向变量 x 指向的 oi 的 field