转载整理自程序依赖相关知识点(PDG,SDG).供自己学习

1. 预备知识:可达性的定义

存在变量 v

  • 定义d:对变量v的赋值语句称为变量v的定义
  • 使用:在某个表达式中引用变量v的值
  • kill:变量v被再次赋值时,上一次赋值对变量v定义d就被kill掉了
  • d可以到达p:定义d到点p之间存在一条路径,且在路径中定义d没有被kill掉

下图为转载文章中截的图

  • d可以通过path2到达u但是不能通过path1到达u,因为k这条语句kill掉了定义d
  • 因为d到u之间存在着没有被kill的路径path2,所以d可以到达u
  • *X = . 叫做精确定义,p = . 叫做模糊定义,因为p可能指向X
  • 一般考虑可达性只考虑精确定义对路径的kill

2. 数据依赖

  • 两个句子存在数据依赖:一条语句中一个变量的定义,可以到达另一条语句中对该变量的使用
  • 在编译领域有不同类型的数据依赖,如果s2依赖于s1,可以是:

s1 写内存 s2 读 (RAW)
s1 读内存 s2 写 (WAR)
s1 写内存 s2 写 (WAW)
s1 读内存 s2 读 (RAR)

在软件工程领域,主要关注RAW依赖,在源码或IR层度上。

  • DU-chains: def-use chains 优点是可以快速得到数据依赖,缺点是必须不断计算和更新,空间开销大
  • 数据依赖图: 将每个语句作为结点,箭头作为有向边
  • SSA:static single assignment 每一次赋值都由一个不同的变量表示
    • 优点:使得分析变得简单高效
    • 缺点是需要添加额外的条件才能正确执行,时空开销大。

如下图所示,转换为SSA就是使得每个变量只有一次定义。转换过程有两个步骤:

  • 为对每一个定义重命名
  • 对所有定义能到达的使用重命名

3. 控制依赖图

控制依赖图控制流图FDT(Forward dominance Tree)产生

  • FDT就是前向支配树
  • d支配(dominate)n,记为d dom n:每一条从流图的入口结点结点n的路径都经过结点d 。在这个定义下每个结点都支配它自己
    如下图所示,左侧为流图,右侧为其对应的支配树。

    在支配树(dominator tree)中,对于结点n来说:
  • 从根节点到结点n所在路径上的结点都严格支配结点n,例如上图中从根节点1 -> 2 -> 3,其中结点1和结点2都严格支配结点3
  • 该路径上离结点n最近的结点叫做结点n的直接支配结点(immediate node),用IDom(n)表示,例如上图中IDom(6) = 2

前向支配树(FDT)指的就是根节点为函数出口的支配树,也就是上图的翻转,如下图所示,右侧为左侧函数对应的FDT(比如5->2的箭头表示,所有从函数出口到2的路径都一定会经过5,因此5是2的主导):

得到FDT后将其与控制流图结合即可得到控制依赖图如下

4. PDG:程序依赖图

程序依赖图

  • 结点代表语句
  • 边代表依赖关系,依赖关系包括数据依赖和控制依赖

数据依赖:

s1: A = B * C;
s2: D = A * E + 1
由于s1语句变量A在s2语句中被读,因此称s2数据依赖于s1

控制依赖:
s1: if (A) then

s2:  B = C * Dendif
由于s1语句变量A的值决定了s2语句是否被执行,因此称s2控制依赖于s1

控制依赖用实箭头表示,数据依赖用虚箭头表示

构建系统依赖图的流程:

  • 做出其控制流图
  • 从中找到控制依赖图和数据依赖图
  • 结合起来即得到PDG图

5. SDG:系统依赖图

系统依赖图:在PDG的基础上增加了一些点和边将整个系统整合在一起表示,对于系统中主函数的依赖图称为program dependence graph,对于其余函数称为procedure dependence graphs

SDG中增加了5类新的结点:
1)调用点
2)actual-in结点:它是具有与调用点相关的控制依赖,将实参的值传入一个临时单元中(例如x_in)
3) actual-out结点:也是具有与调用点相关的控制依赖,将临时单元中的值返回给实参
4)formal-in结点:它是具有与被调函数入口相关的控制依赖,将临时单元中的值复制给形参
5)formal-out结点:也是具有与被调函数入口相关的控制依赖,将形参中的值返回给临时单元

SDG中增加了3类新的边:
1)从调用点指向被调函数入口结点的边
2)parameter-in边:actual-in结点指向formal-in结点的边(相当于实参->临时单元->形参)
3)parameter-out边: formal-out结点指向actual-out结点的边(相当于上述过程的返回过程)

一个SDG图的例子如下:

生成SDG的步骤:

1)首先先生成主函数的program dependence graph,和所有被调函数的procedure dependence graphs

2)对于每一个调用点,添加一条边指向被调函数的入口点

3)对于在调用点处的每一个actual-in的结点,添加一条parameter-in的边,指向被调函数对应的formal-in的结点

4)对于在调用点处的每一个actual-out的结点,添加一条parameter-out的边,由被调函数对应的formal-out的结点所指向加粗样式

【程序分析】数据依赖、控制依赖、程序依赖图PDG、系统依赖图SDG相关推荐

  1. java 程序分析题_java程序入门50题分析:002

    [程序2]题目:判断101-200之间有多少个素数,并输出所有素数. 程序分析2:神马是素数,坑爹么,我都不知道素数,吃素我是知道了.那就百度下吧!!质数又称素数.指在一个大于1的自然数中,除了1和此 ...

  2. 8255a初始化c语言程序,单片机8255型号大全(工作字的选择,单片机连接,初始化程序分析)...

    描述 单片机8255型号大全(工作字的选择,单片机连接,初始化程序分析):工作字该如何选择? 1. 工作方式的控制字 例:设8255A的控制端口地址为00E6H,要把A口指定为方式1输入,C口上半部定 ...

  3. 【翻译】Tricorder-谷歌如何建立程序分析的生态系统

    I. 介绍II. 背景A. 开发流程B. 谷歌的程序分析III. 谷歌程序分析理念A. 0误报率B. 授权用户做出贡献C. 改进数据驱动的可用性D. 工作流集成是关键E. 项目级别定制,而不是用户定制 ...

  4. 软件 2.0 时代的程序分析

    作者 | 张昕 整理 | 晴天 作者经历: 2020.9 – 现在,北京大学计算机系助理教授 2017.9 – 2020.8,美国麻省理工学院计算机与人工智能实验室博士后 2017,博士,美国佐治亚理 ...

  5. Qt Creator分析QML应用程序

    Qt Creator分析QML应用程序 分析QML应用程序 使用QML Profiler 指定Flushing设置 附加到正在运行的Qt Quick应用程序 分析收集的数据 选择事件范围 了解数据 分 ...

  6. 红心大战c语言程序设计教程课后答案,[原创]Windows 红心大战随机发牌程序分析...

    [调试逆向] [原创]Windows 红心大战随机发牌程序分析 2007-11-27 23:28 13191 [调试逆向] [原创]Windows 红心大战随机发牌程序分析 2007-11-27 23 ...

  7. 生成程序片段(程序依赖图PDG)

    生成程序片段(程序依赖图PDG) 生成程序片段 标准方法是: 基于依赖性分析的切片. 使用程序依赖图表示依赖. 从中生成切片. 我们将专注于这种方法.但是,还有其他选择. 程序依赖图 The Prog ...

  8. 【程序分析】程序切片技术

    基本概念 参考:https://zhuanlan.zhihu.com/p/379422670 Program slicing技术:用于提取与某变量强相关的代码部分. 例如,原始程序代码为: 它所要完成 ...

  9. 程序分析工具gprof介绍

    程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析.程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序,从中汲取有价值的内容. ...

最新文章

  1. html 颜色叠加图片,如何在背景图片上添加颜色叠加?
  2. 网络编程五种IO模型之poll模型
  3. html5 json转字符串,web前端-js小记(5)-字符串及json
  4. Linux网络编程服务器模型选择之IO复用循环并发服务器
  5. @程序员,你准备好推出自己的移动应用了吗?
  6. Linux系统的账号管理
  7. kafka测试工具_kafka压测工具:同步方式2000+、异步方式10000+、带源码
  8. 软件工程领域2021年上半年的CCF-A和B类会议列表
  9. 什么是软件测试?进行软件测试的目的是什么?
  10. vsftpd 操作手册 - 完整版
  11. 旅游社交APP开发解决方案
  12. Linux下QT平台Mysql数据库开发环境配置
  13. cmd运行jmeter提示不是内部或外部命令
  14. 预告 | 从单点工具到平台,默安科技研发安全一体化管理平台即将发布
  15. 小鹅通六周年:新知识服务时代,做好企业的“共享CTO”
  16. Substance Painter 服饰材质制作 中间刮痕 - 肩带3
  17. 关于VS2013/VS2019使用scanf函数等报错的解决方案
  18. 2019小明的比赛c++
  19. 宾夕法尼亚大学计算机专业研究生,宾夕法尼亚大学UPenn计算机科学Computer Science专业排名第32位(2021年THE世界大学商科排名)...
  20. NetBox使用方法

热门文章

  1. python 学以致用 量化投资_验证KDJ金叉的行情
  2. 谈谈我对NLP文档级关系抽取中Ign_F1指标的理解(Ign_F1与F1的关系)
  3. 简单NLP分析套路(1)----语料库积累之3种简单爬虫方式应对大部分网站
  4. 【181130】VC++ 模拟地球太阳月亮运动的过程源代码
  5. python小白之路:第一章 初识python
  6. 【剑指Offer】个人学习笔记_46_把数字翻译成字符串
  7. 重新审视Visio的本质
  8. MySQL基础学习——Day5
  9. 计算机二级c语言编译,全国计算机等级考试教程-二级C语言.pdf
  10. 连接MySQL: Connections could not be acquired from the underlying database