Day 8 Interprocedural Analysis

视频地址

南京大学《软件分析》课程07(Interprocedural Analysis)

Content

  1. 为什么要学习过程间分析
  2. 调用图的创建
  3. 过程间CFG
  4. 过程间数据流分析

Motivation

过程内分析的问题

在这里插入图片描述

  • 遇到方法调用时做最保守的估计(假设不是常量)
  • 过程间分析传递数据流,避免精度丢失

Call Graph construction

Call Graph:程序中调用图的一种表示,是调用者到被调者的调用边的集合

应用:

  • 过程间分析基础
  • 程序优化、理解、debug、测试
  • 更多

构造算法

在这里插入图片描述

前置知识

  • java中的方法调用
static callspecial callvirtual call
instructioninvokestaticinvokespecialinvokeinterface
invokevirtual
receiver objectsnoyesyes
target methods(调用方法)static methodsconstructors
private instance methods
superclass instance methods
other instance methods
target methods(调用方法个数)11>=1(polymorphism:多态)
determinacy(决定时刻)compilecompilerun

不难理解处理virtual call是关键

  • virtual call关键步骤:Method Dispatch

在这里插入图片描述

在这里插入图片描述

  • 解决:o所指的对象及方法签名
  • Dispatch(c,m)c中有一个非抽象的且有一样的方法名和修饰符的方法m',则返回m',否则去其父类中继续寻找

在这里插入图片描述

Class Hierarchy Analysis (CHA)

在这里插入图片描述

  • 需要知道整个程序的类继承信息
  • 核心在于通过声明类型去解目标方法,假设a可以指向AA所有的子类

具体算法

在这里插入图片描述

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值