南大《软件分析》——Data Flow Analysis

@(静态分析)

目录

  1. 数据流分析概述

  2. 数据流分析应用

  • Reaching Definitions Analysis(may analysis)
  • Live Variables Analysis(may analysis)
  • Available Expressions Analysis(must analysis)

数据流分析

相关概念

may analysis: 输出可能是正确的,要做over-approxiamation追求sound,可以有误报

must analysis: 输出必须是正确的,要做under-approxiamation追求complete,可以有漏报

无论是over还是under-approxiamation,目标都是实现safe-approxiamation

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

前置知识

Input and Output States

Input and Output States(输入输出状态):程序执行前和执行后的状态

  • IR语句的每次执行都会从输入状态转换到新的输出状态。
  • 输入(输出)状态与语句之前(之后)的程序点相关联。

以上是三种控制流:顺序执行、分支、汇聚

数据流分析结果

In each data-flow analysis application, we associate with every program point a data-flow value that represents an abstraction of the set of all possible program states that can be observed for that point.

在每个数据流分析应用程序中,我们与每个程序点关联一个数据流值,该值代表对该点可以观察到的所有可能程序状态集的抽象。

结果的集合如下,我们只需要该程序点的抽象值

Data-flow analysis is to find a solution to a set of safe-approximation directed constraints on the IN[s]’s and OUT[s]’s, for all statements s.

  • constraints based on semantics of statements (transfer functions)
  • constraints based on the flows of control

Notations for Transfer Function’s Constraints

Transfer Funciton: 给一个input按预定规则输出一个output

转换函数约束分析

  • 前向分析

  • 反向分析

Notations for Control Flow’s Constraints

控制流约束分析

  • Basic Block内部的
  • Basic Block之间的(分为前向和反向)

数据流分析方法

Reaching Definitions Analysis(到达定值分析)

定义:给变量v一个定义d(赋值过程),从程序点p到q存在一个完整路径,且v的定义未被改变

A definition d at program point p reaches a point q if there is a path

from p to q such that d is not “killed” along that path

应用:检测变量是否被初始化。例如,在CFG的入口给每个变量v引入一个虚拟定义,如果这个虚拟定义到达了程序点p即变量v被使用的地方,这就说明v可能未被定义,即未初始化。

Reaching definitions can be used to detect possible undefined

variables. e.g., introduce a dummy definition for each variable v at

the entry of CFG, and if the dummy definition of v reaches a point

p where v is used, then v may be used before definition (as

undefined reaches v)

公式分析

$$ D: v = x\ op\ y $$

该语句“生成”变量v的定义D,并“杀死”程序中定义变量v的所有其他定义,而其余输入定义不受影响。

This statement “generates” a definition D of variable v and “kills” all the other definitions in the program that define variable v, while leaving the remaining incoming definitions unaffected.

Transfer Funtion

基本块的输出等于这个基本块中的定义与此基本块的输入减去程序中其它所有定义了变量v的语句的并集。

本质上输出的就是此基本块与前驱中所有修改变量语句的和

Control Flow

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

算法

Iterative algorithm

目的:输入CFG(计算好每个基本块的$kill_B$和$gen_B$),输出每个基本块的$IN[B]$和$OUT[B]$

算法过程:

boundary condition:初始化OUT[entry]为空

然后所有基本块的OUT[B]初始化为空。(不同的分析方法不一样,may analysis一般初始化为空,must analysis一般初始化为TOP)

遍历每一个基本块B,按Transfer function和Control flow的约束求解块B的IN[B]和OUT[B],只要这次遍历时有某个块的OUT[B]发生变化,则重新遍历一次(因为程序中有循环存在,只要某块的OUT[B]变了,就意味着后继块的IN[B]变了)。

例子

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

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

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

在经过数据流分析算法过后,每个程序点都关联了一个数据流值,该值代表对该点可以观察到的所有可能程序状态的集合的抽象表示(即图里的位向量)

不停用约束求解,最终得到一个稳定的安全的近似约束集。

为什么迭代会停止?

$gen_B$和$kill_B$是不变的,只有IN[B]在变化,所以说OUT[B]只会增加不会减少,n向量长度是有限的,所以最终肯定会停止。

迭代停止说明到达了不动点(fixed point)

Live Variables Analysis(活跃变量分析)

Live variables analysis tells whether the value of variable v at

program point p could be used along some path in CFG starting at p.

If so, v is live at p; otherwise, v is dead at p.

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

(感觉跟污点分析有点类似,标记污点如果路径中用到了就作污点传播,重定义了就消除污点)

用backword analysis

transfer functions

设计transfer functions计算IN[B]

观察v是否在初始化后被重新定义(redefine),4和6都在在redefine之前use了,所以也是live

算法

从exit逆向分析,一般情况下,may analysis初始化为空,must analysis初始化为ALL

IN变了就继续迭代

例子

初始化

根据transfer funtion去逆向迭代算(建议跟着视频算一遍

第一轮迭代,因为Basic Block的IN变了,继续迭代

第二轮迭代

第三轮迭代结束

Available Expression Analysis

An expression x op y is available at program point p if (1) all paths from the entry to p must pass through the evaluation of x op y, and (2) after the last evaluation of x op y, there is no redefinition of x or y

程序点p处的表达式$x\ op\ y$可用需满足2个条件,一是从entry到p点必须经过$x\ op\ y$,二是最后一次使用$x\ op\ y$之后,没有重定义操作数x、y。(如果重定义了x 或 y,如$x = a\ op2\ b$,则原来的表达式$x\ op\ y$中的x或y就会被替代)。

这个算法应该是做编译优化,去除那些重复运算。

用n bit向量来抽象表示,0表示unavailable,1表示available

transfer functions

这是一个forward analysis

a被redefine了,a+b被kill掉。剩下x op y

右下的expression是available的

For safety of the analysis, it may report an expression as unavailable even if it is OUT truly = { x available op y } (must analysis -> under-approximation)

可以有漏报不能有误报。例如:上面的程序变为如下,x在编译前确定值为3,但未做常量传播,会导致漏报少一个优化,不会影响程序编译的正确性

算法

初始化入口为空,其他块为1

例子

初始化

第一次迭代

迭代完成

三种技术对比

|&nbsp|Reaching Definitions|Live Variables|Available Expressions|

|::::

|Domain|Set of definitions|Set of variables|Set of expressions|

|Direction|forward|backward|forward|

|May/Must|May|May|Must|

|Boundary|OUT[entry]=$\emptyset$|IN[exit]=$\emptyset$|OUT[entry]=$\emptyset$|

|Initialization|OUT[B]=$\emptyset$|IN[B]=$\emptyset$|OUT[B]=$\cup$|

|Transfer function|OUT=gen $\cup$ (IN - kill)|OUT=gen $\cup$ (IN - kill)|OUT=gen $\cup$ (IN - kill)|

|Meet|$\cup$|$\cup$|$\cup$|

总结

怎样判断是May还是Must?

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

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

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

南大《软件分析》课程笔记——Data Flow Analysis的更多相关文章

  1. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  2. Coursera台大机器学习技法课程笔记11-Gradient Boosted Decision Tree

    将Adaboost和decision tree相结合,需要注意的地主是,训练时adaboost需要改变资料的权重,如何将有权重的资 料和decision tree相结合呢?方法很类似于前面讲过的bag ...

  3. linux内核分析课程笔记(二)

    运行一个精简的操作系统内核 存储程序计算机是几乎所有计算机的基础逻辑框架. 堆栈是计算机中非常基础的东西,在最早计算机没有高级语言时,在高级语言出现之前,我们没有函数的概念.但高级语言出现后有了函数调 ...

  4. Coursera台大机器学习技法课程笔记03-Kernel Support Vector Machine

    这一节讲的是核化的SVM,Andrew Ng的那篇讲义也讲过,讲的也不错. 首先讲的是kernel trick,为了简化将低维特征映射高维特征后的计算,使用了核技巧.讲义中还讲了核函数的判定,即什么样 ...

  5. Coursera台大机器学习技法课程笔记01-linear hard SVM

    极其淡腾的一学期终于过去了,暑假打算学下台大的这门机器学习技法. 第一课是对SVM的介绍,虽然之前也学过,但听了一次感觉还是很有收获的.这位博主总结了个大概,具体细节还是 要听课:http://www ...

  6. Coursera台大机器学习技法课程笔记05-Kernel Logistic Regression

    这一节主要讲的是如何将Kernel trick 用到 logistic regression上. 从另一个角度来看soft-margin SVM,将其与 logistic regression进行对比 ...

  7. Coursera台大机器学习技法课程笔记10-Random forest

    随机森林就是要将这我们之前学的两个算法进行结合:bagging能减少variance(通过g们投票),而decision tree的variance很大,资料不同,生成的树也不同. 为了得到不同的g, ...

  8. Coursera台大机器学习技法课程笔记08-Adaptive Boosting

    将分类器组合的过程中,将重点逐渐聚焦于那些被错分的样本点,这种做法背后的数学原因,就是这讲的内容. 在用bootstraping生成g的过程中,由于抽样对不同的g就生成了不同的u,接下来就是不断的调整 ...

  9. Coursera台大机器学习技法课程笔记14-Radial Basis Function Network

    将Radial Basis Function与Network相结合.实际上衡量两个点的相似性:距离越近,值越大. 将神经元换为与距离有关的函数,就是RBF Network: 可以用kernel和RBF ...

随机推荐

  1. Stream聚合函数

    Stream班介绍 幼稚园开学的第一天,各们家长把小朋友送到了园里,各位小朋友都你看看我,我看看你.有的嚎啕大哭,有的呆若木鸡....这里时候园长安排我拿来小本本记录入园的小朋友.... 记录小朋友 ...

  2. apiserver源码分析——启动流程

    前言 apiserver是k8s控制面的一个组件,在众多组件中唯一一个对接etcd,对外暴露http服务的形式为k8s中各种资源提供增删改查等服务.它是RESTful风格,每个资源的URI都会形如 / ...

  3. 基于python的pixiv爬虫

    基于python的pixiv爬虫 1.目标 在和朋友吹逼过程中,聊到qq群机器人,突发奇想动手做一个p站每日推荐色图的色图机,遂学习爬虫. 目标: 批量下载首页推荐色图. 由于对qq机器人不熟,先利用 ...

  4. FFT&原根&NTT&MTT

    FFT bilibili 3b1b视频讲解 核心过程: 原根 Definition 若 \(a\) 模 \(m\) 的阶等于 \(\varphi(m)\),则称 \(a\) 为模 \(m\) 的一个原 ...

  5. 题解 「2017 山东一轮集训 Day5」苹果树

    题目传送门 题目大意 给出一个 \(n\) 个点的图,每个点都有一个权值 \(f_i\) ,如果 \(f_i=-1\) 表示 \(i\) 这个点是坏的.定义一个点是有用的当且仅当它不是坏的,并且它连的 ...

  6. javascript高级程序设计第三版书摘

    在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...

  7. 混合开发框架Flutter

    Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...

  8. spring cloud feign的各种配置的使用

    在上一节我们完成了feign的基本使用,学会了feign如何去调用其他微服务,这次我们来完成feign的一些自定义配置. 实现功能:     1.全局修改feign的配置和单独修改feign客户端的配 ...

  9. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  10. js计算精确度丢失问题解决

    (function () { var calc = { /* 函数,加法函数,用来得到精确的加法结果 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精 ...