南京大学《软件分析》- 02 - IR

2023-11-03 22:50
文章标签 分析 02 软件 ir 南京大学

本文主要是介绍南京大学《软件分析》- 02 - IR,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

02 - IR

  1. Compilers and Static Analyzers
  2. AST vs. IR (AST:抽象语法树,在语法分析、词法分析之后的中间表示。)
  3. IR: Three-Address Code (3AC)
  4. 3AC in Real Static Analyzer: Soot
  5. Static Single Assignment (SSA)
  6. Basic Block (BB)
  7. Control Flow Graphs (CFG)

Compilers

输入为 SourceCode

  • Scanner - 词法分析-Lexical Analysis - 检查每一个单词(不一定是英文单词)- 里面用到了正则表达式(Regular Expression)- 最后生成Tokens作为语法分析的输入。
  • Parser - 语法分析 - Syntax Analysis - 检查单词之间的语法规则 - Context-Free Grammar(上下无关语法)- 最后生成AST(抽象语法树)。
  • Type Checker - 语义分析 - Sementic Analysis - 检查类型处理合理 - Attribute Grammar - 最后生成Decorated AST(装饰的抽象语法树)。
  • Translator - 翻译 - 最后生成IR(一般是指3D码)。
  • Code Generator - 代码生成器 - 最后生成机器码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BhLZcD4-1672029451488)(image_1.0ec8e307.png)]

AST vs. IR

  • AST

    • 表达层次比较高,与语法树非常贴合
    • 依赖于不同的语言
    • 适合快速的类型检查
    • 在控制流信息流分析
  • IR - (“3-address” form)

    • 表达层次比较低,与机器码相近,与汇编相近
    • 与语言相关性不强
    • 压缩且简洁
    • 包含控制流信息
    • 经常被考虑作为静态分析的基础
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyClofWv-1672029451489)(image_2.6644520b.png)]

Intermediate Representation (IR)

3-Address Code 三地址码。引入临时变量,一般包含三个信息:

  • 名称
  • 常量
  • 编译临时变量

每种指令都有他们自己的三地址码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JSvcLxJJ-1672029451489)(image_3.6be88b87.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mpkZOisi-1672029451490)(image_4.cdaeea2b.png)]

3AC in Real Static Analyzer: Soot

真实的三地址码,Java的IR,Jimple in Soot

https://github.com/Sable/soot

Loop循环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teAgwV3d-1672029451490)(image_5.b64799b5.png)]
在这里面x和i在soot中,x被优化掉了。所以在三地址码中看到只有i。【又或者说是,i被优化掉了,仅存在一个x,是不是更加合理?】

Do-while 循环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nAMAPvAh-1672029451490)(image_6.3265c0cb.png)]

Method Call

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ACqLrVR-1672029451491)(image_7.6fe44518.png)]
前面的前几个变量(r0,r1,r2,r3)是Jimple翻译器用来临时使用的声明的变量,和一些需要用的变量的类型。

r0声明的是MathodCall3AC这个类型,this指向当前这个对象。

Class

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NjRxrsrI-1672029451491)(南京大学《软件分析》.assets/image-20221225180528861.png)]
在PL中,在引用一个变量的时候,它会将变量给加载进来。例如上图的

public static void <clinit>()
{<nju.sa.examples.Class3AC: double pi> = 3.14;return;
}

Static Single Assignment (SSA)-可选

SSA是IR里面一种经典的转化模式。

  • 给每一个定义一个新的命名。
  • 传递新的变量名到后续的式子使用。
  • 一个变量只有一个精确的定义。
    在这里插入图片描述
    在这里插入图片描述
    以上PPT,针对x0和x1会引入φ(phi-function)这个函数进行统合。
    SSA有典型的特征:
  • 每一个变量(variable)都有自己的一个定义。
  • 如果要用多重的x,会引入一个φ函数。

为什么不SSA?

  • 可能太多φ函数。

Basic Block (BB)

  • 一个BB的入口一定是第一条指令。
  • 一个BB的出口一定是最后一条指令。
  • 满足以上两个条件之后的最大的指令集合。

在这里插入图片描述

如何设计一个算法去生成BB块呢?

  • 确定每个BB的入口(Leader)
    • 程序当中的第一个指令是入口(Leader)
    • 任何跳转指令(jump/goto)的目标指令(target)
    • 紧跟在所有跳转指令的后面一条指令
  • 建立BB
    • 一个BB包括一个入口(leader)和Leader后面所有跟随的指令,知道遇到下一个Leader。

在这里插入图片描述

如何在BB基础上建立CFG?

添边。

Control Flow Graphs (CFG)

三地址码最终还是要转化为控制流图CFG。

添边的规则:

  • CFG的结点是BB。
  • 满足跳转指令:从A的结尾到B的开始,添边。
  • 不满足跳转指令的(紧接在跳转指令后的一条指令)需要添加一条边。
  • B紧接着A之后,添边。
    • 除非A的最后一条指令是一条无条件跳转指令(jmp/goto)
  • 将跳转到块替换跳转到指令是合理的。
  • 一个BB可以有多个前驱,也可以有多个后继。
  • 最后需要添加两个结点:EntryExit
    • 入边(Entry)只有一个
    • 出边(Exit)可以有多个

在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

这篇关于南京大学《软件分析》- 02 - IR的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341402

相关文章

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock