南京大学软件分析第九节——Pointer Analysis - Foundations I

文章详细介绍了指针分析的概念,包括分析域、指针关系的传播以及指针流图(PFG)的构建和使用。指针分析的核心是通过PFG传播指针关系,并通过特定算法处理assign语句和new语句。文章还提到了Java的静态分析工具如Soot、WALA和Chord。
摘要由CSDN通过智能技术生成

视频:南京大学《软件分析》课程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指针分析规则

首先确定分析域和记号的表示
image.png
变量、函数、对象、实例域、指针、指向关系
针对上节课末尾提到的四种句子进行分析
image.png
横线上的是前提条件,横线下的是结论

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 中添加边
image.png
基于 PFG,指针分析可以通过计算 PFG 的传递闭包来解决,如下图:基于 PFG,语句 j 可以从结点 b 沿着路径 b、a、oi. f、e 来传播
image.png
综上,指针分许分为两步

  • 构建 PFG
  • 基于 PFG 传播指向关系信息

这两步互相依赖,相辅相成。传播指向信息需要基于构建好的 PFG,在传播指向信息的同时 PFG 也在动态更新。

3 指针分析的算法

image.png

  • 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

老师给了个例子,建议看视频过一遍例子。
课间提到了几个 Java 的开源静态分析项目:SootWALAChord

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值