写在前面的话

本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知识点的理解。也由于这是本人第一次开坑写博客,结构内容自有诸多不合理之处,希望有问题的地方大家可以指出。

上一篇文章中讲到了静态分析的中间表示,并引出了用于分析的控制流图,本文将依据控制流图讲述数据流分析的方法。由于数据流分析的方法难度较大,内容较多,将分为上下两篇讲述。


系列文章目录

1.静态程序分析(Static Program Analysis)介绍
2.中间表示(Intermediate Representation)
3.数据流分析(Data Flow Analysis) (上):可达性分析(Reaching Definitions)
4.数据流分析Data Flow Analysis) (下):存活变量分析(Live Variables Analysis)及可用表达式分析(Available Expressions Analysis)
5.数据流分析基础(Data Flow Analysis-Foundations)
6.过程间分析(Interprocedural Analysis)
7.指针分析(Pointer Analysis)入门
8.指针分析基础知识(Pointer Analysis Foundations)


一、什么是数据流分析

数据流分析主要研究数据流如何在控制流图中运行,即研究下面这张图。
这就是数据流分析的主要思想,研究特定的抽象符号代表的数据在特定环境中安全流动,这个环境主要研究控制流图中的传递函数和控制流处理。

不同的数据流分析拥有不同的抽象方法,不同的安全近似策略,不同的传递函数和不同的控制流处理方案。


二、控制流分析的知识预备

2.1 输入输出状态

先放张图帮助理解

输入输出状态有两个性质:

  1. 每个输入/输出状态都与一个在IR块(可以理解为一个Basic Block)前/后的程序点相对应;
  2. 每一次IR块的执行,都会将一个旧的输入转换为一个新的输出。

我们会为每个程序点关联一个数据流值,这个值用来代表可观测到的程序数据集的抽象。(这句话比较抽象,后续会有具体示例)
数据流分析的目的是为所有语句的输入输出找到一组,基于控制流和传递函数的,安全的近似约束的解决方案。(依旧抽象,后续解释)

2.2 传递函数约束的表示方法


如图是前向传播与反向传播的示例,前向传播即输出由输入根据IR块的传递函数决定的,反向传播同理。

上图是一个对控制流分析过程的抽象表示。
第一句表示:后一句的输出等于前一句的输入
第二句表示:BB的输入等于第一句的输入,BB的输出等于最后一句的输出。
黄色句表示:前向传播的输出由输入经过运算获得,输入由指向自己的输出的union决定。
红色句表示:反向传播的输入由输出经过运算获得,输出由自己指向的输入的union决定。


三、Reaching Definitions Analysis

此节开始正式讲述数据流分析的应用,Reaching Definitions Analysis就是其中的一种分析方法。

3.1 Reach的定义(Reaching Definitions):

定义:
如果在程序中点p到点q构成一条路径,在点p处的定义d在这条路径中不会被杀死,则称定义d可以从点p reach 点q。

换句话说,就是:p处定义的变量v从点p可以 reach 点q,当且仅当,v在整个路径中不会获得新的定义。

Reaching Definitions可以用来检测可能存在的、使用了未定义变量的情况。例如,在CFG入口为每个变量引入一个虚拟定义,如果这个虚拟定义能从入口reach一个使用了该变量的点p,那么这个变量就有可能未定义便被使用。(因为“未定义”reach了使用变量的p)

3.2 理解Reaching Definitions

3.2.1 怎么表示Reaching Definitions


如图所示,可以使用bit编码表示在某程序点的多个Reaching Definitions,从左数第几个字节就是第几个definition,Di如果为0表示Di无法reach该程序点,Di如果为1表示Di可以reach该程序点。

3.2.2 如何理解D

D即Definition,可以表示为

D:v = x op y

一个D可以视为一行三地址码,做了两件事:

  1. 生成了一个定义D
  2. 在保持其他传入程序不受影响的同时,杀死了程序中其他对变量v的定义

所以对于对于BB而言可以得到以下传递函数:

与此同时得到以下控制流函数:

其中U表示union,结合前文使用bit字节表示的D,可以知道,IN[B]的输入等于OUT[P1]并OUT[P2],意味着只要存在一条路径可以reach,那么就算作可以reach。

3.2.3 Reaching Definitions的算法表示


这便是Reaching Definitions的算法表示形式,其中入口和每个OUT都初始化为空集即00000的形式,是因为1并0或1都是1,会导致算法无法继续进行。
算法的停止条件是:经过一次完整的迭代后,迭代前后所有的OUT都不再发生改变。
接下来放一个分析过程,大家意会一下。

可以看到OUT[B5]其实在第一次迭代后就达到了稳定值,但是因为这时静态分析,不像动态分析那样只看结果,所以要等到所有过程迭代后都不会变化才可以结束。
注释:BB块标号顺序的不同可能会导致达到稳定状态的迭代次数的不同,但是不会影响稳定状态的结果。并且经过简单的分析可以知道,迭代必会有一个最终的稳定状态,而不会一直循环迭代。


四、总结

以上就是本文的全部内容了,主要是介绍了数据流分析是什么,并首先介绍了一种数据流分析的算法。下一篇文章中将会介绍另外两种算法及一些总结内容。

【软件分析/静态程序分析学习笔记】3.数据流分析(Data Flow Analysis) (上):可达性分析(Reaching Definitions)相关推荐

  1. 【软件分析/静态程序分析学习笔记】7.指针分析(Pointer Analysis)入门

    写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...

  2. 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)

    写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...

  3. v54.04 鸿蒙内核源码分析(静态链接) | 一个小项目看中间过程 | 百篇博客分析HarmonyOS源码

    子曰:"回也其庶乎,屡空.赐不受命,而货殖焉,亿则屡中." <论语>:先进篇 百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 一个小项目看中 ...

  4. timequest静态时序分析学习笔记之工具使用

    第三章 工具使用 这里我通过几条约束命令来讲解timequest工具的简单使用. 3.1 creat_clock约束命令 相关代码: 图27 第一步,在quartus ii软件tools下来菜单中找到 ...

  5. GPS软件接收机matlab程序学习笔记(一)

    clear all;clc;cla;close all; format longg; %%15位有效数 %% 一. 设定GPS数据文件参数 %%%%%%%%%%%%%% gps_bd = 0; % 0 ...

  6. spring data jpa从入门到精通_程序员笔记:Spring Data JPA入门

    什么是JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为了 ...

  7. 矩阵分析学习笔记(五):数域上矩阵的特征矩阵

    文章目录 写在前面 数域上矩阵的特征矩阵 特征矩阵的定义 两个矩阵相似当且仅当它们的特征矩阵等价 多项式矩阵的次数 矩阵多项式乘积的次数 矩阵多项式的带余除法 特征矩阵的Smith标准型 特征矩阵的不 ...

  8. 南大软件分析 前5节笔记

    IR Intermediate Representation 中间表示 3AC 三地址码 3-Address Code 每条3AC至多有三个地址,地址可以是名称,常量,编译器生成的临时变量 其实3AC ...

  9. win10运行C语言的程序,win10系统运行软件提示应用程序发生异常0xc0000409的具体教程...

    有关win10系统运行软件提示应用程序发生异常0xc0000409的操作方法想必大家有所耳闻.但是能够对win10系统运行软件提示应用程序发生异常0xc0000409进行实际操作的人却不多.其实解决w ...

  10. igmpproxy_Linux IGMP PROXY 学习笔记 之二 igmp proxy的处理流程分析

    上一节中我们分析了linux kernel中igmp proxy相关的数据结构与实现需求分析,本节我们分析kernel中对组播数据流和组播数据的处理流程. 对于目的ip地址为组播地址的数据,可以分为两 ...

最新文章

  1. Postgresql服务器配置-设置参数
  2. 每天一个linux命令(46):vmstat命令
  3. 在 Mac 上多开微信,还能看到朋友撤回的信息:WeChatTweak
  4. Python脚本文件和函数的基本运用
  5. yii添加模型基础类
  6. 嵌入式常见笔试题总结(4)
  7. Spring boot Mybatis 整合(完整版)
  8. php中读取文件内容的几种方法。(file_get_contents:将文件内容读入一个字符串)...
  9. Qt总结之五:读写文件操作
  10. linux 端口映射 命令,linux查看端口映射命令
  11. Altium Designer 入门教程
  12. [渝粤教育] 淄博职业学院 市场营销 参考 资料
  13. windows添加hosts
  14. 战狼2影评-20170807
  15. 机器学习算法各个击破
  16. 大一计算机思维知识点,大学计算机基础教学中计算思维的培养途径
  17. openChannelsActivity:fail getChannelsLiveInfo:fail
  18. python cheat sheet
  19. 使用wireshark找不到“捕获接口”问题的解决
  20. 获取/设置input中的鼠标光标位置

热门文章

  1. c#禁止任务管理器关闭任务
  2. Matlab 向量的处理
  3. 制作U盘引导盘,安装Ubuntu18.04系统
  4. python库阿里云镜像大全
  5. lua 函数 默认值_简明lua教程
  6. python contains用法_jQuery contains过滤器实现精确匹配使用方法
  7. Win32计算器:输入出生年月日,输出周岁,星座以及距离下一次生日的天数
  8. VS导入easyx图形库
  9. 服务器虚拟化的技术和原理,虚拟化一、虚拟化技术基础原理
  10. linu离线安装java1.8