改进版field-sensitive指针分析算法

news2024/11/14 7:26:52

DEA

  • 1.Introduction
  • 2.Approach
    • 2.1.Stride-based Field Representation
      • 2.1.1.示例1
      • 2.1.2.示例2
    • 2.2.完整算法
  • 3.Evaluation
    • 3.1.Implementation
    • 3.2.结果
  • 参考文献

1.Introduction

这篇paper是SVF团队对PKH field-sensitive指针分析算法 [ 2 ] ^{[2]} [2] 的优化,在使用SVF时如果用该优化后的算法,添加运行参数 -sfrander,聚焦的是Andersen算法之上的field-sensitive(不考虑flow-sensitivity)。PKH算法的推导规则如下所示,在不考虑field-sensitivity时,只有 addrof 规则会在pts集合中生成新的address-taken variable,而现在 field 规则也会生成新的address-taken variable。

请添加图片描述
在该规则下,对于指针运算 q = p + j (p, q 是指针类型,j 是整数类型),如果 p 是结构体指针或者指向数组,那么对于该类指令的处理等效于 q = p

PKH算法的一个示例如下所示:

源代码:

typedef struct A {
	int idx; /* f0 */ 
	A* next; /* f1 */ 
} A;

A* p, q;
for(...){
	p = malloc(...);//o
	q = &p->next;
	p = q;
}

约束:

  • { o } ⊆ p \{o\} \subseteq p {o}p

  • p + 1 ⊆ q p + 1 \subseteq q p+1q ( p + 1 p + 1 p+1 表示 p->next,即 p 的第1个field)

  • q ⊆ p q \subseteq p qp

求解过程如下图所示:

请添加图片描述可以看到程序存在链表结构,其中会出现带正整数的环路( p → 1 q p \stackrel{1}{\rightarrow} q p1q, q → p q \rightarrow p qp,环路数值为1,这种环全称positive weight cycle,即PWC)。可以看到运行时:

  • 不断有新的address-taken vairable被生成。为了避免无限生成,PKH设置了最大field访问层数。

  • field-insensitive中用到的强连通分量分析不能直接用在PWC上,因为PWC中每个node的pts可能不同。

为了解决这个问题,作者提出了DEA算法,这是一个stride-based representation来压缩field object,与PKH的对比如下图所示,图中address-taken variable o . f 3 o.f_3 o.f3, o . f 5 o.f_5 o.f5, o . f 7 o.f_7 o.f7 都会被压缩为1个address-taken variable o . f 3 + 2 k o.f_{3+2k} o.f3+2k。这样一来减少了传播过程中的pts集数量以及求解 load/store 时新建的 copy 边数量。同时,像 r r r, p 1 p_1 p1, p 2 p_2 p2 这样关键变量的pts集合没有发生改变。

请添加图片描述

2.Approach

2.1.Stride-based Field Representation

Definition 1 (Stride-based Field Representation, 简称SFR):对于pts集中的address-taken variable,作者这里表示为三元组 σ = < o , i , S > \sigma = <o, i, S> σ=<o,i,S> o o o 为address-taken variable本身, i i i 表示访问第 i i i 个field, S S S 为一个集合表示偏移量。 σ \sigma σ 的field expansion可以表示为:

F X ( σ ) = { { o } i f    S = ∅ ∧ i = 0 { o . f i ∣ j = i + ∑ n = 1 ∣ S ∣ k n . s n , j ≤ m a x , k n ∈ N , s n ∈ S } o t h e r w i s e FX(\sigma) = \left\{ \begin{aligned} &\{o\} && {if \; S = \empty \land i = 0} \\ &\{o.f_i | j = i + \sum\limits_{n = 1}^{|S|}k_n.s_n, j \leq max, k_n \in N, s_n \in S\} & & {otherwise}\\ \end{aligned} \right. FX(σ)= {o}{o.fij=i+n=1Skn.sn,jmax,knN,snS}ifS=i=0otherwise

以下面例子为例,右边PKH算出 p 2 p_2 p2 的pts集为 o . f 3 o.f_3 o.f3, o . f 5 o.f_5 o.f5, o . f 6 o.f_6 o.f6, …。这个集合可以表示为 o 3 + 2 k 1 + 3 k 2 o_{3 + 2k_1 + 3k_2} o3+2k1+3k2 ( k 1 k_1 k1, k 2 k_2 k2 为正整数),其中 p 2 p_2 p2 相对 r r r 的field偏移量至少为2,r的field偏移量至少为1,因此 p 2 p_2 p2 可以表示为 σ 2 = < o , 3 , { 2 , 3 } > \sigma_2 = <o, 3, \{2, 3\}> σ2=<o,3,{2,3}>

请添加图片描述
Definition 2 (Overlapping and disjointed SFR):overlapping表示为两个SFR至少会访问同一个address-taken variable相同的偏移量1次,记为 σ ∩ σ ′ ≠ ∅ \sigma \cap \sigma^{'} \neq \empty σσ=。反之,则是disjointed。

SFR的推理规则如下,可以看出:

  • p t s pts pts 集合里的元素都是SFR形式的 σ \sigma σ 而不是object o o o

  • addrof 依旧会新建address-taken variable,但是对于 field 指令 p = q->fi,新创建的SFR object σ = < o , i + j , S ∪ S ′ > \sigma = <o, i + j, S \cup S^{'}> σ=<o,i+j,SS> 只有不为当前 p t s ( p ) pts(p) pts(p) 内任一元素的子集时才会被添加(依旧有可能有不同SFR object存在overlapping)。

请添加图片描述

2.1.1.示例1

对于前面倒数第二图中的示例,PKH会不断新建object o . f i o.f_i o.fi,而DEA总共创建了3个SFR object σ 1 \sigma_1 σ1, σ 2 \sigma_2 σ2, σ 3 \sigma_3 σ3。具体过程为:

  • 初始时 r r r, p 1 p_1 p1 的pts集合为 σ 1 = { o , 1 , { 0 } } \sigma_1 = \{o, 1, \{0\}\} σ1={o,1,{0}}

  • 计算 s t r i d e s ( p 2 ⟵ f i e l d 2 p 1 ) strides(p_2 \stackrel{field_2}{\longleftarrow} p_1) strides(p2field2p1) s t r i d e s ( q 1 ⟵ f i e l d 1 q 2 ) strides(q_1 \stackrel{field_1}{\longleftarrow} q_2) strides(q1field1q2) 时前者属于两个PWC(大圈和小圈),总权重分别为 2 , 3 2, 3 2,3。后者只属于1个PWC总权重 3 3 3,因此计算结果分别为 { 2 , 3 } \{2, 3\} {2,3} { 3 } \{3\} {3}

  • 处理 p 2 ⟵ f i e l d 2 p 1 p_2 \stackrel{field_2}{\longleftarrow} p_1 p2field2p1 时新建 σ 2 = < o , 2 + 1 , { 0 } ∪ { 2 , 3 } > = < o , 3 , { 0 , 2 , 3 } > \sigma_2 = <o, 2 + 1, \{0\} \cup \{2, 3\}> = <o, 3, \{0, 2, 3\}> σ2=<o,2+1,{0}{2,3}>=<o,3,{0,2,3}>

  • 处理 q 1 ⟵ f i e l d 1 q 2 q_1 \stackrel{field_1}{\longleftarrow} q_2 q1field1q2 时,此时分析了几个copy之后,假设 p t s ( q 2 ) = { σ 2 } pts(q_2) = \{\sigma_2\} pts(q2)={σ2},第一次处理该edge时,新建 σ 3 = < o , 3 + 1 , { 0 , 2 , 3 } ∪ { 3 } > = < 0 , 4 , { 0 , 2 , 3 } > \sigma_3 = <o, 3 + 1, \{0, 2, 3\} \cup \{3\}> = <0, 4, \{0, 2, 3\}> σ3=<o,3+1,{0,2,3}{3}>=<0,4,{0,2,3}>

  • 算法稳定后分析结果如上图所示。

2.1.2.示例2

改进后的 storeload 处理规则如下所示,添加 copy 边时,需要注意可能存在不同SFR object存在overlap情况。作者用 M o . f i M_{o.f_i} Mo.fi 表示包含 o . f i o.f_i o.fi 的所有SFR object。处理 load 时,如果 σ ∈ p t s ( q ) \sigma \in pts(q) σpts(q),那么对于 F X ( σ ) FX(\sigma) FX(σ) 中的任意 o . f i o.f_i o.fi 都有可能存在其它 σ ′ \sigma^{'} σ 引用了 o . f i o.f_i o.fi,因此除了 σ \sigma σ 外, σ ′ \sigma^{'} σ 也会和 p p p 存在 copy 关系。

请添加图片描述

下图示例中处理 load r ⟵ s t o r e p r \stackrel{store}{\longleftarrow} p rstorep 时, p t s ( p ) = { σ 1 } pts(p) = \{\sigma_1\} pts(p)={σ1},但是 σ 1 ∩ σ 2 = { o . f 4 } \sigma_1 \cap \sigma_2 = \{o.f_4\} σ1σ2={o.f4},因此除了添加 copy r ⟵ c o p y σ 1 r \stackrel{copy}{\longleftarrow} \sigma_1 rcopyσ1 外还有 r ⟵ c o p y σ 2 r \stackrel{copy}{\longleftarrow} \sigma_2 rcopyσ2

请添加图片描述

2.2.完整算法

完整算法如下图所示,这是基于wave propagation的Andersen算法实现:

请添加图片描述

3.Evaluation

3.1.Implementation

对于C++,virtual call p->foo() 会被翻译成指令序列

  • vtptr = *p:该 load 通过 p 获得virtual table pointer。

  • vfn = &vtptr->idx:该 field 通过索引 idx 以及vtable entry获取target function。

  • fp = *vfn:该 load 获取function address。

  • fp(p):函数调用指令。

关于virtual call,以下面示例为例:

class Base {
public:
    // 虚函数
    virtual void show() {
    }

    // 非虚函数
    void display() {
    }

    // 虚析构函数,保证正确的析构顺序
    virtual ~Base() {}
};

// 派生类
class Derived : public Base {
public:
    // 重写虚函数
    void show() override {
    }

    // 重写非虚函数(注意,这不是多态的)
    void display() {
    }
};

int main() {
    // 基类指针指向派生类对象
    Base* basePtr = new Derived();

    // 虚函数调用(根据对象类型,调用 Derived 类的函数)
    basePtr->show();    // 输出:Derived class show function
    // 非虚函数调用(根据指针类型,调用 Base 类的函数)
    basePtr->display(); // 输出:Base class display function

    // 释放内存
    delete basePtr;

    return 0;
}

编译成IR后 basePtr->show(); 的指令如下:

%3 = load %class.Base*, %class.Base** %basePtr, align 8
%4 = bitcast %class.Base* %3 to void (%class.Base*)***
# 对应vtptr = *p
%vtable = load void (%class.Base*)**, void (%class.Base*)*** %4, align 8
# vfn = &vtptr->idx
%vfn = getelementptr inbounds void (%class.Base*)*, void (%class.Base*)** %vtable, i64 0
# fp = *vfn
%5 = load void (%class.Base*)*, void (%class.Base*)** %vfn, align 8
# fp(p)
call void %5(%class.Base* noundef nonnull align 8 dereferenceable(8) %3)

basePtr->display() 对应的指令为

%6 = load %class.Base*, %class.Base** %basePtr, align 8
# 对应Base::display方法,也就是直接确定调用目标不存在多态
call void @_ZN4Base7displayEv(%class.Base* noundef nonnull align 8 dereferenceable(8) %6)

benchmark信息如下图所示。

请添加图片描述

3.2.结果

PKH和DEA处理的变量数量如下图所示,可以看到数量有了大幅缩小。

请添加图片描述
时间开销对比如下图所示,柱状图每个元素左柱为PKH,右柱为DEA,可以看到时间开销DEA远少于PKH。
请添加图片描述

参考文献

[1].Lei Y, Sui Y. Fast and precise handling of positive weight cycles for field-sensitive pointer analysis[C]//Static Analysis: 26th International Symposium, SAS 2019, Porto, Portugal, October 8–11, 2019, Proceedings 26. Springer International Publishing, 2019: 27-47.

[2].Pearce D J, Kelly P H J, Hankin C. Efficient field-sensitive pointer analysis of C[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 2007, 30(1): 4-es.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pycharm中python文件导入torch模块时报错:No module named ‘torch‘

问题描述 导入torch时报错 上网查找后&#xff0c;发现原因可能是没有安装pytorch&#xff0c;但检查后发现自己已经安装了&#xff0c;遂考虑到可能是没有使用正确的环境 解决方法 因为是PyCharm 没有使用我所安装了 PyTorch 的 Conda 环境&#xff0c;所以报错了&#xf…

计算2的100次方

#include <stdio.h>int main() {int a[100] {0};a[0] 1;for(int i 0;i < 100;i)//乘100次2{for(int j 0; j < 100;j)//乘以每一位{a[j] * 2;//每一位都*2}for(int k 0;k < 99;k){if(a[k] > 10)//判断进位{a[k 1];a[k] - 10;}}}//找到第一个不为0的数&a…

vue part 9

动画与过渡 Test.vue <template><div><button click"isShow !isShow">显示/隐藏</button><transition name"hello" appear><h1 v-show"isShow">你好啊!</h1></transition><transition …

51单片机快速入门之点灯 STC 51单片机

第一步创建工程 第二步加载头文件 第三步编写代码 点灯完成 解释:主函数为main() 内部P1控制的是p1.0-p1.7 引脚 0为低电平

银河麒麟国产化系统(或者是Linux)一键安装docker和docker-compose

在国产化化机器上离线安装docker和docker-compose 第一步&#xff0c;查询国产化系统的cpu架构 使用如下命令都可以查询出来&#xff1a; # 查询全部 uname -a # 只查询部分 uname -p # 查了cpu 列表 lscpu 查询示例如下&#xff1a; 为麒麟桌面版 为麒麟服务版 第二步&a…

人工智能领域各方向顶级会议和期刊

会议 人工智能基础与综合&#xff1a;AAAI、CICAI (!)、UAI、IJCAI 机器学习&#xff1a;COLT、ICLR、ICML、NeurIPS 模式识别与计算机视觉&#xff1a;ECCV、CVPR、ICCV 语言与语音处理&#xff1a;ACL、EMNLP 知识工程与数据挖掘&#xff1a;SIGKDD、SIGMOD、ICDE、SIGIR、V…

golang-基础知识(array, slice, map)

1. array array就是数组&#xff0c;我们可以通过如下方式定义一个数组并对数组中的元素进行赋值 var arr [n]type // 定义一个大小为n&#xff0c;类型为type的数组 arr[0] xx // 对数组中的元素进行赋值 其中[n]type中&#xff0c;n表示数组的长度&#xff0c;type表示数…

【数字】xilinx的AXI VIP如何使用的guide

AXI 验证 IP (VIP)AXI Stream VIP 可用于为支持定制 RTL 设计流程的 AXI 主设备及 AXI 从设备验证连接和基本功能性。此外&#xff0c;它还支持贯通模式&#xff0c;该模式明显有助于用户监控事务处理信息&#xff0f;吞吐量或驱动有源激励。AXI VIP 提供的实例测试台和测试可演…

SolidWorks 质量属性和截面属性

系列文章目录 前言 SOLIDWORKS 应用程序根据模型几何体和材料属性计算质量、密度、体积等属性。 您可覆盖某些属性的计算值。 您可查看以下质量属性&#xff1a; 零件多实体零件中的实体装配体装配体中的零部件 在零件或装配体中&#xff0c;您可查看面和草图的区域属性。 您可…

【HarmonyOS NEXT】实现网络图片保存到手机相册

【问题描述】 给定一个网络图片的地址&#xff0c;实现将图片保存到手机相册 【API】 phAccessHelper.showAssetsCreationDialog【官方文档】 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5#showassetscreationdialog…

【FastAPI】离线使用Swagger UI 或 国内网络如何快速加载Swagger UI

在FastAPI中&#xff0c;默认情况下&#xff0c;当应用启动时&#xff0c;Swagger UI 会通过在线加载 Swagger UI 的静态资源。这意味着如果应用运行在没有互联网连接的环境中&#xff0c;默认的 Swagger 文档页面将无法加载。 为了在离线环境中使用 Swagger UI&#xff0c;你…

二分思想与相关例题(上)

在上一篇浅谈二分思想中&#xff0c;我们谈到了提过二分的本质&#xff0c;其实就是不断折半&#xff0c;折到最后折无可折的那个结果就是最符合要求的结果。 现在我们从答案出发&#xff0c;对答案的整体可能范围不断二分&#xff0c;最后找到最合适的答案。我们称这种方法为…

Visual Studio安装教程

这次我给大家讲一下Visual Studio安装 一、官网下载 官网下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ 下载下来的是一个.exe文件 双击打开&#xff0c;出现下面的界面 二、安装visual studio &#xff08;一&#xff09;更改安装路径 首先&am…

Oracle数据恢复—Oracle数据库误删除表数据如何恢复数据?

删除Oracle数据库数据一般有以下2种方式&#xff1a;delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法&#xff08;不考虑全库备份和利用归档日志&#xff09;。 1、delete误删除的数据恢复方法。 利用oracle提供的闪回方法…

小程序——生命周期

文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热…

202409011在飞凌的OK3588-C的核心板跑Rockchip原厂的Android12时挂载触摸屏ft5x06之后使用i2c-tools检测

1|console:/ # i2cdetect --version console:/ # i2cdetect -l console:/ # i2cdetect -F 7 console:/ # i2cdetect -a -y 7 1|console:/ # i2cdump --version console:/ # i2cdump -f -y 7 0x38 202409011在飞凌的OK3588-C的核心板跑Rockchip原厂的Android12时挂载触摸屏ft5x0…

基于SpringBoot+Vue+MySQL的瑜伽馆管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 本系统采用SpringBoot作为后端框架&#xff0c;Vue.js构建前端用户界面&#xff0c;MySQL作为数据库存储系统&#xff0c;实现了瑜伽馆的全面数字化管理。系统涵盖会员管理、课程预约、教练排班、收入统计等功能模块&#xff0c…

苍穹外卖Day01

文章目录 目录 文章目录 前端环境搭建 后端环境搭建 后端-数据库环境搭建 前后端联调 前端环境搭建 打开文件夹&#xff08;确保nginx在英文目录下&#xff09;双击ngnix.exe启动nginx服务&#xff0c;访问端口号80在地址栏输入localhost打开界面 后端环境搭建 熟悉项目…

Node.js运行环境搭建

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战&#xff08;Web前端技术丛书&#xff09;》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) 本节介绍如何搭建Node.js运行环境。 1.2.1 Node.js运行环境安装 进入Node.js官…

淘宝 npmmirror 镜像站的使用

1、访问网址 https://npmmirror.com/ 2、由于国内直接使用 npm 的官方镜像是非常慢的&#xff0c;推荐使用淘宝 NPM 镜像。 淘宝 NPM 镜像是一个完整 npmjs.org 镜像&#xff0c;可以用于代替官方版本。 3、操作方法也非常的简单&#xff0c;只需要在安装完npm后&#xff0…