【静态分析】静态分析笔记03 - 数据流分析(应用)

参考:

【课程笔记】南大软件分析课程3——数据流分析应用(课时3/4) - 简书

----------------------------------------------------------------------------

1. 数据流分析总览

may analysis: 输出可能正确的信息(需做 over-approximation 优化,才能成为 Safe-approximation 安全的近似,可以有误报),注意大多数静态分析都是 may analysis
must analysis: 输出必须正确的信息(需做 under-approximation 优化,才能成为 Safe-approximation 安全的近似,可以有漏报)

不同的数据分析应用会有不同的数据抽象方法和不同的流安全近似策略,即不同的转换函数和控制流处理。

Nodes (BBs/statements)、Edges (control flows)、CFG (a program)

例如:

application-specific Data <- abstraction (+/-/0)

Nodes <- Transfer function

Edges <- Control-flow handling

不同的数据流分析 有 不同的数据抽象表达 和 不同的安全近似策略,如 不同的 转换规则控制流处理。

2. 预备知识

输入/输出状态:程序执行前/执行后的状态(本质就是抽象表达的数据的状态,如变量的状态)。

  • 每个 IR 块的执行将 input 转换为 output
  • input 与之前的 output 关联,output 与之后的 input 关联

每个数据流分析的应用中,将每个程序点关联一个数据流值(data-flow value),这个值代表在那个点能观察到的所有可能的程序状态的抽象。

例如,我只关心x、y的值,我就用抽象来表示x、y所有可能的值的集合(输入/输出的值域/约束),就代表了该程序点的程序状态。

3. Reaching Definitions Analysis

Reaching Definitions Analysis 是一个 may analysis。

问题定义:给变量 v 一个定义 d(赋值),存在一条路径使得程序点 p 能够到达 q,且在这个过程中不能改变 v 的定义 d。

抽象表示:设程序有 n 条赋值语句,用 n 位向量来表示变量 v 的定义 d 能 reach 与不能 reach。

(1)公式分析

什么是definition?

D: v = x op y,op为operation,如 x + y。

Transfer Function

解释:基本块 B 的输出 = 块 B 内的所有变量 v 的定义(赋值/修改)语句 并上 (块 B 的输入 - 整个程序中其它所有变量 v 的定义)。

Control Flow

解释:基本块 B 的输入 = 块 B 所有前驱块 P 的输出的并集。注意,所有前驱块意味着只要有一条路径能够到达块B,就是它的前驱,包括条件跳转与无条件跳转。

(2)算法

目的:输入 CFG,计算好每个基本块的 killB 和 genB,输出每个基本块最终的 IN[B] 和 OUT[B]。

方法

(3)实例

抽象表示:设程序有 n 条赋值语句,用 n 位向量来表示变量 v 的定义 d 能 reach 与不能 reach。

说明:红色-第1次遍历;蓝色-第2次遍历;绿色-第3次遍历。

结果:3次遍历之后,每个基本块的 OUT[B] 都不再变化。

最后得到了,每个程序点关联的数据流值(该点所有可能的程序状态的一个抽象表示,也就是这个 n 位向量)。

(4)算法会停止吗?

会。

genS 和 killS 是不变的,只有 IN[S] 在变化,而 IN[S] 只会在原来的基础上越来越大(与more facts 并集),所以 OUT[S] 只会越来越大,直到达到一个上限。

所以最终 changes to any OUT 不会再发生变化,算法就停止了。

4. Live Variables Analysis

Live Variables Analysis 是一个 may analysis。

问题定义:某程序点 p 处的变量 v,从 p 开始到 exit 块的 CFG 中是否有某条路径用到了 v,如果用到了 v,则 v 在 p 点为 live,否则为 dead。其中有一个隐含条件,在点 p 和引用点之间不能重定义 v。

应用场景:可用于寄存器分配,如果寄存器满了,就需要替换掉不会被用到的变量。

抽象表示:程序中的 n 个变量用长度为 n bit 的向量来表示,对应 bit 为1,则该变量为 live,反之为 0 则为 dead。

(1)公式分析

Control Flow

理解:我们是前向分析,只要有一个后一个节点的 IN 是 live,父节点就是 live。

Transfer Function

理解:IN[B] = 本块中 use 出现在 define 之前的变量 U(OUT[B] 的 live 情况 - 本块中 define 的变量)。

特例分析:如以下图所示,第4种情况,v = v - 1,use 出现在 define 之前,v 为 live。

(2)算法

目的:输入 CFG,计算好每个基本块中的 defB 和 useB。输出每个基本块的 IN[B] 和 OUT[B]。

方法:首先初始化每个基本块的 IN[B] 为空集。遍历每一个基本块 B,按以上两个公式计算块 B 的OUT[B] 和 IN[B],只要这次遍历时有某个块的 IN[B] 发生变化,则重新遍历一次。

问题:遍历基本块的顺序有要求吗? 没有要求,但是会影响遍历的次数。

初始化规律:一般情况下,may analysis 全部初始化为空,must analysis 全部初始化为 all。

(3)实例

抽象表示:程序中的 n 个变量用长度为 n bit 的向量来表示,对应 bit 为1,则该变量为 live,反之为 0 则为 dead。

说明:从下往上遍历基本块,黑色-初始化;红色-第1次;蓝色-第2次;绿色-第3次。

结果:3次遍历后,IN[B] 不再变化,遍历结束。

5. Available Expressions Analysis

Available Expressions Analysis 是一个 must analysis。

问题定义:程序点 p 处的表达式 x op y 的值可用需满足2个条件,一是从 entry 到 p 点必须经过 x op y,二是最后一次计算 x op y 之后,没有重定义操作数 x、y。(说明上一次计算的 x op y 的值还可用)。

应用场景:用于优化,检测全局公共子表达式。

抽象表示:程序中的 n 个表达式,用长度为 n bit 的向量来表示,1表示可用,0表示不可用。

说明:属于forward分析。

(1)公式分析

Transfer Function

理解

genB — 基本块 B 中所有新的表达式(并且在这个表达式之后,不能对表达式中出现的变量进行重定义);

killB — 从 IN 中删除变量被重新定义的表达式。

Control Flow

理解:从 entry 到 p 点的所有路径都必须保证 上一次最后一次计算该表达式的值 等于 现在计算该表达式的值(现在该表达式的值不用重新计算)。

问题:该分析为什么属于 must analysis 呢?

因为我们允许有漏报,不能有误报。虽然漏报了,但是不影响程序分析结果的正确性。

(2)算法

方法:首先将 OUT[entry] 初始化为空(因为目前没有一个表达式被计算),所有基本块的 OUT[B] 初始化为1...1。遍历每一个基本块 B,按以上两个公式计算块 B 的 IN[B] 和 OUT[B],只要这次遍历时有某个块的 OUT[B] 发生变化,则重新遍历一次。

(3)实例

抽象表示:程序中的 n 个表达式,用长度为 n bit 的向量来表示,1表示可用,0表示不可用。

说明:黑色-初始化;红色-第1次;蓝色-第2次。

结果:2次遍历后,OUT[B] 不再变化,遍历结束。

6. 三种分析技术对比

问题:怎样判断是 May 还是 Must?

Reaching Definitions 表示只要从赋值语句到点 p 存在1条路径,则为 reaching,结果不一定正确;

Live Variables 表示只要从点 p 到Exit 存在1条路径使用了变量 v,则为 live,结果不一定正确;

Available Expressions表示从 Entry 到点 p 的每一条路径都经过了该表达式,则为available,结果必须正确。

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

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

相关文章

【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您

小伙伴朋友们&#xff1a; 此刻&#xff0c;我怀着无比激动与深深感激的心情&#xff0c;写下这篇特别的博文。今天&#xff0c;我的CSDN总访问量成功突破了百万大关&#xff0c;这不仅是一个数字的跨越&#xff0c;更是你们对我的支持、信任与鼓励的有力见证。在此&#xff0…

C语言学习笔记之操作符篇

目录 算术运算符 移位操作符 整型在内存中的存储&#xff08;补充知识&#xff09; ​编辑左移操作符 右移操作符 位操作符 赋值操作符 复合赋值操作符 单目操作符 关系操作符 逻辑操作符 && 与 || 的计算特点 条件操作符 逗号表达式 下标引用操作符 函…

Canal 同步mysql 到es 日期格式报错解决

第一步&#xff1a;下载源码alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com) 第二步&#xff1a;编辑源码&#xff08;client-adapter下面的clinet-adapter.escore)&#xff1a; com.alibaba.otter.canal.client.adapter.es.core.support.ESSyncUt…

聚丙烯PP它的化学特性是什么? UV胶水能够粘接聚丙烯PP吗?

聚丙烯PP它的化学特性是什么? UV胶水能够粘接聚丙烯PP吗&#xff1f; 聚丙烯&#xff08;Polypropylene&#xff0c;简称PP&#xff09;是一种热塑性聚合物&#xff0c;属于聚烯烃类塑料之一。以下是聚丙烯的一些化学特性&#xff1a; 1. 分子结构&#xff1a; 聚丙烯是由丙烯…

【赛题】2024年MathorCup数学应用挑战赛C题赛题发布

2024年MathorCup数学应用挑战赛——正式开赛&#xff01;&#xff01;&#xff01; C题 物流网络分拣中心货量预测及人员排班 赛题已发布&#xff0c;后续无偿分享各题的解题思路、参考文献、完整论文可运行代码&#xff0c;帮助大家最快时间&#xff0c;选择最适合是自己的赛…

[CSS]布局

盒子就是把网站分割成一小块一小块的吧&#xff0c;然后方便移动或者管理 背景 属性名描述background-color设置元素的背景颜色。background-image设置元素的背景图片。背景图片与背景颜色同时设置时&#xff0c;则图片覆盖颜色。写法如下&#xff1a;background-image: url(&…

2024年mathorcup数学建模思路及论文助攻

题目B 题 甲骨文智能识别中原始拓片单字自动分割与识别 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文明的起源具有重要意义&#xff0c;也对世界文明的研究有着深远影响。在我…

微信小程序-接入sse数据流并实现打字机效果( ChatGPT )

从流中获取的数据格式如下 小程序调用SSE接口 const requestTask wx.request({url: xxx, // 需要请求的接口地址enableChunked: true, // enableChunked必须为truemethod: "GET",timeout: 120000,success(res) {console.log(res.data)},fail: function (error) {//…

农场大乐斗游戏演示

功能介绍 农场系统 种菜操作&#xff1a;用户可以在农场中种植农作物&#xff0c;并进行浇水、杀虫、除草等维护操作。干旱、虫害、杂草都会影响农作物的生长速度和产量。农作物成熟后&#xff0c;用户需要及时收取&#xff0c;否则会在24小时后枯死&#xff0c;但可通过观看…

python通过url爬取视频资源到本地

很久之前我写过一篇通过url爬取图片地址的博文&#xff0c;说实在的&#xff0c;利用python实现自动化爬取资源确实很香。我本身是搞前端的。所以对py只是简单看了下&#xff0c;并不算多了解。因此之前写的那篇博文内容也很简单。简单到新手一看就会&#xff0c;一学就能用。方…

【C 数据结构】循环链表

文章目录 【 1. 基本原理 】【 2. 循环链表的创建 】2.1 循环链表结点设计2.2 循环单链表初始化 【 3. 循环链表的 插入 】【 4. 循环单链表的 删除操作 】【 5. 循环单链表的遍历 】【 6. 实例 - 循环链表的 增删查改 】【 7. 双向循环链表 】 【 1. 基本原理 】 对于单链表以…

刷代码随想录有感(29):用队列实现栈

不难理解&#xff0c;题干如下&#xff1a; 代码如下&#xff1a; class MyStack { public:queue<int> q;MyStack() {}void push(int x) {q.push(x);}int pop() {int size q.size();size--;while(size--){q.push(q.front());q.pop();}int res q.front();q.pop();retur…

kali桥接校园网实现上网

1.查看校园网信息 1. vim /etc/network/interfaces 添加下列信息&#xff0c;地址、网关、掩码和主机一样即可 3.vim /etc/resolv.conf 添加dns解析 4. /etc/init.d/networking restart 重启网络即可

探索AI工具导航网站

在现代科技发展迅猛的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了各行各业中不可或缺的一部分。了解和利用最新的AI工具对于工作、学习和娱乐都具有重大意义。在这篇博客中&#xff0c;我们将探索一些最新的人工智能工具导航网站&#xff0c;以及其中一款名…

【力扣】125.验证回文串

刷题&#xff0c;过了真的好有成就感&#xff01;&#xff01;&#xff01; 题解&#xff1a; 根据题目要求&#xff0c;我们需要处理一下几个问题&#xff1a; 将大写字母转变成小写对原来的字符串进行处理&#xff0c;只要字母和数字考虑只有一个和字符串为空的情况 1、将…

docker最简单教程(使用dockerfile构建环境)

一 手里有的东西 安装好的docker+dockerfile 二 操作 只需要在你的dockerfile文件下执行命令 docker build -t="xianhu/centos:gitdir" . 将用户名、操作系统和tag进行修改就可以了,这就相当于在你本地安装了一个docker环境,然后执行 docker run -it xianhu/ce…

第10天:基础入门-HTTP数据包Postman构造请求方法请求头修改状态码判断

第十天 一、HTTP/S 数据包请求与返回 数据-方法&头部&状态码 常规请求-Get——>访问网页获取资源用户登录-Post——>提交数据进行验证 head&#xff1a;与服务器索与 get 请求 一致的相应&#xff0c;响应体不会返回&#xff0c;获取包含在小消息头中的原信息&…

Spring Web MVC的入门学习(二)

本篇接着Spring Web MVC的入门学习&#xff08;一&#xff09;-CSDN博客来继续学习Spring MVC。 一、从请求中获取Header 1、传统获取 header 获取Header也是从 HttpServletRequest 中获取。 代码&#xff1a; import jakarta.servlet.http.HttpServletRequest; import jakar…

vue3+vite+typescript+pinia+element_plus构建web项目

1.vite搭建 yarn create vite 可能会提示node版本不支持&#xff0c;需要根据提示升级或降级node版本 使用nvm下载对应版本 nvm download 18.x.xnvm use 18.x.x// 需要安装yarn npm install -g yarn// 重新执行 yarn create vite 过程中会提供选择&#xff0c;分别选择vue、…

MySQL 实例student表综合查询

目录 例题&#xff1a; 1、查询student表的所有记录 2、查询student表的第2条到4条记录 3、从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 4、从student表中查询计算机系和英…