引入
目前的所有分析都是过程内分析,不处理方法调用的。
- 做最保守的假设
- 不精准之源头
为了更好的精度,使用过程间分析。在方法调用时,会有调用和返回边来传递数据流,避免过度假设造成的精度损失。
调用图CHA
程序中一种调用关系的表示,从调用点链接到目标方法。
应用:
- 所有过程间分析的基础
- 程序优化
- 程序理解
- 程序调试
- 程序测试
- 。。。
OO语言的调用图构造
- 类层次分析CHA
- 快速类型分析RTA
- 变量类型分析VTA
-
Virtual call的方法调度
程序运行时,一个virtual call被确定是具体调用哪个由以下两点决定:
- virtual call返回内容的接收对象是谁:c
- 初始化worklist(包含待处理方法)、cg(调用图)、rm(可达方法集)
- 当wl不空,就取方法出来,如果rm中没有,就把m加入rm,对m中的调用点去解调用,并把边加入cg,方法m’加入wl
- 有ICFG才能做过程间分析
ICFG包含方法的CFG以及: - 调用边,从调用点到被调用方法的开头
- 如何通过类层次分析构造调用图
- ICFG的概念
- 过程间数据流分析
- 过程间常量传播
CHA
需要程序的类继承信息
CHA的方法就是对A自己和所有子类的函数进行查找(感觉这个表述不是很完整)
算法
过程间控·制流图
CFG表示单个方法结构
ICFG表示整个程序的结构过程间常量传播分析
调用边转换:传参数
返回边转换:传返回值节点转换:和之前的过程内常量传播一样的,添加了一个杀死left hand side变量的转换,因为过程间没有考虑外部函数,但左边的参数在调用函数后被外部修改了,这个时候变量就不一样了,所以需要删掉。
需要知道的
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!