视频地址
南京大学《软件分析》课程07(Interprocedural Analysis)
Content
- 为什么要学习过程间分析
- 调用图的创建
- 过程间CFG
- 过程间数据流分析
Motivation
过程内分析的问题
- 遇到方法调用时做最保守的估计(假设不是常量)
- 过程间分析传递数据流,避免精度丢失
Call Graph construction
Call Graph:程序中调用图的一种表示,是调用者到被调者的调用边的集合
应用:
- 过程间分析基础
- 程序优化、理解、debug、测试
- 更多
构造算法
前置知识
- java中的方法调用
static call | special call | virtual call | |
---|---|---|---|
instruction | invokestatic | invokespecial | invokeinterface invokevirtual |
receiver objects | no | yes | yes |
target methods(调用方法) | static methods | constructors private instance methods superclass instance methods | other instance methods |
target methods(调用方法个数) | 1 | 1 | >=1(polymorphism:多态) |
determinacy(决定时刻) | compile | compile | run |
不难理解处理virtual call
是关键
virtual call
关键步骤:Method Dispatch
- 解决:
o
所指的对象及方法签名 Dispatch(c,m)
:c
中有一个非抽象的且有一样的方法名和修饰符的方法m'
,则返回m'
,否则去其父类中继续寻找
Class Hierarchy Analysis (CHA)
- 需要知道整个程序的类继承信息
- 核心在于通过声明类型去解目标方法,假设
a
可以指向A
和A
所有的子类
具体算法
- example
稍微注意下b.foo()
:关键在于对Dispatch()
的理解
如果代码为B b = new B()
,Resolve
结果不变,但明显出现了不精确
- 特点
整个程序的调用图构造:
- 具体算法
- example(具体分析可看视频、或对应上面的算法)
interprocedural CFG
- ICFG:代表整个程序的结构,是由CFG和两种特殊的边构成
- Call edges:调用点连接到目标方法的入口
- Return edges:目标方法的return语句连接到调用点(call site)的下一个(ruturn site)
void foo(){
bar(); //call site
int n=3; //return site
}
ICFG = CFGS + call & return edges
- example
- 为什么要保留调用点和返回点之间的边(黑色的)呢?
interprocedural Data-Flow Analysis
- 重要的就是数据流的传递
interptrocedural Constant Propagation
- LHS:左手边
example
- 对于之前的问题即可解决:利于传播函数内部的数据流(本地数据流),减小负担
- 这幅图也解释了为什么要kill掉LHS