过程间指针分析
调用图
过程间的指针分析需要建立调用图。传统的CHA是根据声明类型来建立调用图,会引入大量的无用边。
通过指针分析可以构建比CHA更精确的调用图和指向关系。
规则
r = x.k(a1,...,an)
的规则为
\[o_i\in pt(x),m=Dispatch(o_i,k)\\ o_u\in pt(a_j),1\le j \le n\\ \underline{o_v\in pt(m_{ret})}\\ o_i\in pt(m_{this})\\ o_u\in pt(m_{pj}),1\le j \le n\\ o_v\in pt(r)\]在调用的时侯,要做四件事情:
- 根据$x$可能指向的对象和方法$k$得到调用的方法(集合)$m$
- 为每个方法$m$传入$m$的this参数$m_{this}$
- 为每个方法$m$传入第$j$个形参$m_{pj}$,值(集)为第$j$个实参的指向集合。同时在PFG中添加$a_j\rightarrow m_{pj}$的边
- 将每个方法$m$的每个返回值$m_{ret}$加入r指向的对象集合,并在PFG中添加$r\leftarrow m_{ret}$的边