IR

  • Intermediate Representation 中间表示

3AC

  • 三地址码 3-Address Code
  • 每条3AC至多有三个地址,地址可以是名称,常量,编译器生成的临时变量
  • 其实3AC就是指令的一种表示形式

BB

  • 基本块 basic block
  • 基本块是满足一下性质的连续3AC:只能从块的第一条指令进入;只能从块的最后一条指令离开
  • 构建程序P的基本块算法
    • 寻找leader(leader就是基本块的入口)

      • P的第一条指令是一个leader
      • 跳转目标是一个leader
      • 跳转指令的后一条指令也是一个leader
      • 一个基本块就是一个leader一直到下一个leader前的所有指令

CFG

  • 控制流图 control flow graph
  • 控制流图的一个结点可以是一条单独的3AC,更常见的是一个基本块BB
  • 构建控制流图算法
    • 首先构建程序基本块
    • 构建边:块 A 和块 B 之间有一条边,当且仅当:A 的末尾有一条指向了 B 开头的跳转指令;A 的末尾紧接着 B 的开头,且 A 的末尾不是一条无条件跳转指令

数据流分析

PP

  • 程序点 program point
  • 在数据流分析中,我们会把每一个PP关联一个数据流值,代表在该点中可观察到的抽象的程序状态。

输入输出状态

  • 每一条IR的执行,都会使状态从输入状态变成新的输出状态
  • 输入/输出状态与语句前/后的 program point相关联。

转移方程

  • 每条语句 s 都会使程序状态发生改变,这个所谓的方程f_x()对应的就是语句使得状态发生变化的操作
  • 分析数据流有前向后后向两种,每条语句对应的状态转移方程也有两种。

控制流约束

  • 这指的是状态的变化需要和控制流对应,比如说有两个基本块A1和A2都指向基本块B,那么B的输入状态就应该是A1、A2输出状态的交集

Reaching Definitions Analysis 到达定义分析

  • 假设v在PPp处有定义x,如果存在一个路径从PPp到PPq,并且在该路径上没有v的其他定义,则称v的定义x到达p点。
  • 如果在这条路径上有v的其他定义,则称变量v的定义x被killed
  • 应用举例:分析程序是否存在变量未初始化:在程序入口为各变量引入一个 dummy 定值。当程序出口的某变量定值依然为 dummy,则我们可以认为该变量未被定义。

到达定义的转移方程

OUT[B]=genB∪(IN[B]−killB)IN[B]=∪papredecessorofBOUT[P]\begin{matrix}OUT[B]=gen_B\cup(IN[B]-kill_B) \\ IN[B]=\cup_{p\,a\,predecessor\,of\, B}OUT[P] \end{matrix} OUT[B]=genB​∪(IN[B]−killB​)IN[B]=∪papredecessorofB​OUT[P]​

  • 从输入状态减掉kill掉的变量,并加入新生成的变量

到达定义的更新算法

  • 一个迭代算法,具体看视频吧。

Live Variables Analysis 活跃变量分析

  • 假设v在PPp处有定义x,如果存在一个路径从PPp到PPq,并且在该路径上使用变量v并且在使用前没有重新定义v,则称v的定义x在这段路径上活跃。
  • 反之称为被killed
  • 应用举例:可以用于寄存器分配,当一个变量不会再被使用,那么此变量就可以从寄存器中腾空,用于新值的存储。

活跃变量分析的转移方程(与上面reach分析不同的是,这里用backward的分析)

OUT[B]=∪sasuccessorofBOUT[S]IN[B]=useB∪(OUT[B]−defB)\begin{matrix}OUT[B]=\cup_{s\,a\,successor\,of\,B}OUT[S] \\ IN[B]=use_B\cup(OUT[B]-def_B) \end{matrix} OUT[B]=∪sasuccessorofB​OUT[S]IN[B]=useB​∪(OUT[B]−defB​)​

算法

Available Expression Analysis 可用表达式分析

  • 从流图入口结点到达 p 的每条路径都对 x + y 求了值,且在最后一次求值之后再没有对 x 或 y 赋值,则称x+y可用
  • 应用举例:可用表达式可以用于全局公共子表达式的计算。也就是说,如果一个表达式上次计算的值到这次仍然可用,我们就能直接利用其中值,而不用进行再次的计算。

转移方程

OUT[B]=genB∪(IN[B]−killB)IN[B]=∩papredecessorofBOUT[P]\begin{matrix}OUT[B]=gen_B\cup(IN[B]-kill_B) \\ IN[B]=\cap_{p\,a\,predecessor\,of\, B}OUT[P] \end{matrix} OUT[B]=genB​∪(IN[B]−killB​)IN[B]=∩papredecessorofB​OUT[P]​
注意这里公式里的in是交集,因为定义中要求每条路径都对表达式求值而且最后一次求值后没有定义,所以对于每条路径的out进行merge用交集。

比如上图这个例子,左边的路径中对x进行赋值了,但是是在最后一次计算表达式之前赋值,所以out仍然是表达式。如果左边路径的BB中把最后一次计算去掉,那out就是空了,最后两条路径merge的in就是空。

算法


上述算法的共同点都是不同迭代直到每个结点的值都不再更新了,那么此时每个结点的值就是真实程序会达到的状态吗,到达此状态后每个结点就真的不会再变化了吗?下面老师进行数学上的证明

Upper and Lower Bounds

对于偏序集中的某子集 S 来说:
若存在元素 u 使得 S 的任意元素 x 有 x⊑\sqsubseteq⊑u,那么我们说 u 是 S 的上界(Upper bound)。
同理,若存在元素 l 使得 S 的任意元素 x 有 l⊑\sqsubseteq⊑x,那么我们说 l 是 S 的下界(Lower bound)。

然后我们衍生出最小上界和最大下界的概念:
在 S 的所有上界中,我们记最小上界(Least upper bound, lub)为 ⊔\sqcup⊔ S,满足所有上界 u 对 lub 有:⊔\sqcup⊔ S ⊑\sqsubseteq⊑ u
类似地我们也能定义出最大下界(Greatest lower bound, glb)为⊓\sqcap⊓ S。
并不是每个偏序集都有 lub 和 glb,但是如果有,那么该 lub, glb 将是唯一的。

Lattice, Semilattice, Complete and Product Lattic

  • 给定一个偏序集,如果任意元素 a, b 都有 lub和glb,那么这么偏序集就叫做 格(lattice)
  • 如果在此之上更加严格一些,任意集合都存在 lub 和 glb,那么我们说这个 lattice 为“全格(complete lattice)
  • 另外还有 Product Lattice,多个 lattice 的笛卡尔积也能形成一个新的 lattice。

Data Flow Analysis Framework via Lattice

一个数据流分析框架(D, L, F)由以下元素组成:

  • D: 数据流的方向,前向还是后向
  • L: 包含了数据值 V 和 meet, join 符号的格
  • F: V -> V 的转移方程族

从而,数据流分析可以被视为在 lattice 的值上迭代地应用转移方程和 meet/join 操作符。

参考

写在前面

南大软件分析 前5节笔记相关推荐

  1. 2019夏令营之行(下) 南大软件+北邮网研院

    夏令营(上):https://blog.csdn.net/Cc_Sonia/article/details/95238001 正如上篇博客所说,北航计算机是我最满意的结果,所以剩下的这两个夏令营我就没 ...

  2. 2017届南京富士通南大软件校招软件工程师面经

    好久没来写博文,本着为以后找工作的小伙伴提供一些准备面试的思绪,还是要把后面的面经分享出来~~~ 南京富士通南大软件很早就在南邮宣讲了,在9月21日.当时没有想到去宣讲会,因为我想找软测相关工作,富士 ...

  3. 【静态分析】【系列1-南大软件分析】1.0 导论学习笔记

    文章目录 印象回顾 二刷复习 主要内容 课程说明 本节划重点 个人理解重点和扩展 理解并记忆内容 扩展信息:南大硕士招生信息 印象回顾 昨天看了南大<软件分析>的第一节导论,回忆一下还记得 ...

  4. 华东师大计算机、南大软件、国防科大智能夏令营面经

    南京大学软件学院夏令营面经+真题 下面我直接进行正题,想了解我情况的可以去看我上一篇博客. 经历 南大软件学院的总流程是:面试+机试 上机考试时系统只支持编程语言:C++,Java.而且是2选1,用j ...

  5. 北邮 复习 软件工程_软件工程专业考研——上交、北邮、南大对比分析

    由于互联网的极速发展,软件工程专业逐渐成为考研的热门专业,同学们在择校上还是会有一些迷茫,接下来必尚考研为同学们对上海交通大学.北京邮电大学和南京大学的软件工程专业考研分析吧! 上海交通大学位于上海市 ...

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

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

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

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

  8. 【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation

  9. 南京大学软件分析第九节——Pointer Analysis - Foundations I

    视频:南京大学<软件分析>课程09(Pointer Analysis - Foundations I)哔哩哔哩_bilibili 课程主页:Static Program Analysis ...

最新文章

  1. GVINS:基于GNSS视觉惯性紧耦合的平滑状态估计方法
  2. 不使用递归求全排列和组合数
  3. 福建省计算机一级应用技术基础知识,求福建省计算机一级考试的基础题
  4. 如何最大化利用CPU性能创作沉浸式VR体验
  5. 关于Python IDE自动补全功能不好用的问题,解决方案
  6. aix oracle版本查看命令,AIX 常用命令
  7. Silverlight C# 游戏开发:自定义鼠标(一)
  8. linux r语言 安装包下载,R语言安装程序包(示例代码)
  9. 牛顿法详解(海森矩阵如何使用)
  10. PS星光闪耀滤镜:Topaz Star Effects Mac版
  11. 冒险岛2计算机内存不足建议使用,冒险岛2游戏设置详解 低配电脑如何流畅运行冒险岛2...
  12. window10 删除桌面删除不掉的ie图标(快捷方式)
  13. LeetCode精选TOP面试题(中等篇)【出现率降序】
  14. python在冒号处显示语法错误_python冒号错误语法无效
  15. MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors
  16. SQL 注释语句 (--与/*...*/)
  17. ESB企业服务总线 --- ESB概述
  18. python画二元函数的图像(3D)
  19. 引起进程调度的原因有以下几类
  20. 软件测试 pytest pytest的命名规则 用例的前后置 conftest.py 定制allure报告 @pytest.mark.parametrize()装饰器作数据驱动

热门文章

  1. 玩转ChatGPT:制作思维导图
  2. CVPR17论文有感:A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection
  3. SeniorUI11_SVG实现可交互式中国地图
  4. RTMP vs SRT:延迟与最大带宽的比较
  5. 绿色荧光素标记氨基酸,FITC标记的丹酰化氨基酸,Amino acid-FITC
  6. Python数据分析复习整理(综合应用)
  7. SCARA机器人运动学模型建立
  8. AJAX调试技术 IE篇
  9. JavaScript第二十二章 跨域资源共享
  10. margin或padding值为1个、2个、3个、4个的时候分别代表什么意思