【静态分析】静态分析笔记02 - Intermediate Representation

参考:

[南京大学]-[软件分析]课程学习笔记(二)-IR_ast和ir的区别-CSDN博客

------------------------------------------------------------------------------------------------------------

1. compilers and static analyzers

compiler 是将 Source Code 转换成 Machine Code,中间过程如下:

为什么不直接拿 source code 做静态分析?

因为首先要确保这是一份合格的代码,词法正确,语法正确,语义正确,而后再进行分析 non-trivial 的一些属性,而不是在可能编译不通过,运行不起来的程序中去分析这些 trivial 属性。

PS:这里可能还是需要看应用场景,应用场景不同,其需求不同,source code 有时确实会比 IR 或者 machine code 表达出更丰富的语义。在OSS重用,代码相似性的 field 中,确实存在若干 paper 基于 source code 构建代码相似性。

2. AST vs IR

  • 抽象语法树是 high-level,且比较接近语法结构的,而 IR 是 low-level 且接近机器代码的
  • AST 依赖于语言,而 IR 通常独立于语言
  • AST 适合快速类型检查,而 IR 的结构更加紧凑和统一
  • AST 缺少控制流信息,而 IR 包含了控制流信息

可以看到 IR 和 AST 相比,IR阶段是更适合进行静态分析的阶段。

3. IR: three-address code (3AC)

每条指令右边最多有一个操作符。

每当出现多个操作符,可以通过引入临时变量来解决。

为什么叫3地址码呢?因为最多可以包含3个地址,地址可以是以下三种形式:

  • Name: a, b
  • Constant: 3
  • Compiler-generated temporary: t1, t2

4. 3ac in real static analyzer: Soot

5. Static Single Assignment(SSA)

静态单一赋值:

  • 每个变量都有自己的定义
  • 不同的控制流汇入一个块中,则会导致多个变量备选,因此 merge 时引入 phi-function

Why SSA:

  • 流信息会间接的引入到独特的变量名称中;对流不敏感的分析可能会得到流敏感分析的一些精度;
  • Define-and-use 是显示的,在一些按需任务中可以更有效的存储和传播数据事实;一些优化器任务在SSA上表现的更好,例如条件变量传播,全局变量计数等

Why not SSA:

  • 会引入太多变量;
  • 转换为机器码时会带来性能问题;

6. Basic blocks(BB)

一个 BB 中尽可能含有多的序列

  • BB 入口只能是第一条指令
  • BB 出口只能是最后一条指令

BB 入口唯一,出口也唯一

3AC -> BB:

  1. 决定 BB 的起始指令:
    1. 程序的第一条指令为一个起始指令;
    2. 任何条件跳转或者非条件跳转的目标指令是一个起始指令;
    3. 任何跳转指令的下一条指令为一个起始指令;
  2. 建立程序 P 的 BB:
    1. 一个基本块包含一条起始指令和直到下一条起始指令的所有指令序列

7. Control Flow Graphs(CFG)

7.1 CFG的节点就是BB;
7.2 block A 和 block B之间有边,条件是:

    条件跳转和非条件跳转从 A 的结尾到 B 的开头
    在原始指令顺序中,B 紧接着 A(无条件goto不可以 )

7.3 用跳转到基本块来代替跳转到指令;
7.4 添加 Entry 和 Exit,Entry 连接第一个BB,Exit 连接最后一个BB;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/529349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实时云渲染视频流化Webgl引擎模型技术原理

数字孪生领域很多项目B/S架构下交付使用的是webgl方案,该方案有其自身的优势,降低了用户在使用数字孪生或者虚拟仿真模型时需要的高性能显卡。但其也有自身无法忽视的困境,比如一些数据量大的模型,需要验证依赖下载时的网络环境&a…

c语言驾驶员理论课程模拟考试与学习系统1300

定制魏:QTWZPW,获取更多源码等 目录 1问题描述 2功能要求 【选做要求】 【其他要求】 部分代码展示 效果展示 程序设计题4:驾驶员理论课程模拟考试与学习系统 1问题描述 要求编写一个程序,模拟驾驶员科目一的考试,要求具有良…

Android获取连接到手机热点上的设备信息

主题:在手机开启热点网络的情况下,想要获取是哪个设备已经连接上了当前开启的热点。 实现思路:Android通过读取 /proc/net/arp 文件可以得到连接当前热点的设备信息,包括Mac地址、IP地址等信息。 一. 方法逻辑: /*** …

Webots常用的执行器(Python版)

文章目录 1. RotationalMotor2. LinearMotor3. Brake4. Propeller5. Pen6. LED 1. RotationalMotor # -*- coding: utf-8 -*- """motor_controller controller."""from controller import Robot# 实例化机器人 robot Robot()# 获取基本仿真步长…

IDEA无法成功配置Tomcat的解决方法(IDEA版本问题)

在创建Servlet时,下载了Tomcat文件夹以及成功配置了环境变量之后,在IDEA中怎么都找不到Tomcat,尝试了网络中的各种方法,都不行,结果发现时IDEA版本的问题。因为我下的IDEA是社区版的,所以没有自带的Tomcat&…

Flutter开发之图片选择器

使用FLutter开发了一个图片选择的组件,功能如下: 1、支持设置最大可选图片的个数; 2、根据选择的图片个数自适应容器组件的高度; 3、可设置容器的最大高度; 4、支持点击放大和删除功能; 具体效果如下 …

Linux系统安装内网穿透实现固定公网地址访问本地MinIO服务

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂&am…

【计算机考研】408算法大题怎么练?

先说结论:基础阶段学好各个数据结构与,重点是数组、链表、树、图。然后强化阶段突破算法提 在基础阶段,并不需要过于专门地练习算法。相反,基础阶段的重点应该放在对各种数据结构原理的深入理解上。在我个人的经验中,…

计算机考研择校|408还是自命题,哪个上岸难度大?

我一般是建议选择408,但是现在考408的同学太多了 所以408的竞争压力会比较大,加上复习难度大,复习过程中,心态很容易崩掉。 其实到底选自命题还是408,我觉得还是要看自己的目标。如果目标院校是自命题,那…

C语言的显式类型转换和隐式类型转换详细讲解

目录 一、类型转换 1、显式类型转换 2、隐式类型转换 二、算术转换 三、总结 每个编译器都会对表达式做两件事情,一是判断表达式中操作符的优先级和结合性,二是判断表达式中的操作数类型是否一致,如果不一致则需要进行类型转换。第一点在…

吴恩达机器学习实践实验室:决策树(Decision Trees)

在本练习中,您将从头开始实施决策树,并将其应用于蘑菇可食用还是有毒的分类任务。 文章目录 1-包2-问题陈述3-数据集3.1一个热编码数据集 4-决策树4.1计算熵4.2分割数据集4.3计算信息增益4.4获得最佳分割 5-构建树 1-包 首先,让我们运行下面…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb ,双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错,执行其他命令也报错。 安装环境:ubuntu18.04 dpkg: 处理软件包 code-insiders (…

代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机、22. 买卖股票的最佳时机 II

代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机、22. 买卖股票的最佳时机 II 121. 买卖股票的最佳时机题目解法 122. 买卖股票的最佳时机 II题目解法 感悟 121. 买卖股票的最佳时机 题目 解法 题解链接 没看题解想出来的:贪心 class Solution { pub…

归档模式下,物理删除数据文件的完全的恢复

归档模式下,物理删除数据文件的完全的恢复 1、实验环境 环境归档模式 SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /arch/archivelog Oldest online log seq…

用户态网络缓冲区的设计

一、网络缓冲区 在内核中也是有网络缓冲区的,比如使用 read 读取数据(read 是一种系统调用,第一个参数为 fd),当陷入到内核态的时候,会通过 fd 指定 socket,socket 会找到对应的接收缓冲区。在…

抓住风口,快速上手RAG应用开发!

免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」; 不要急着评判文章列出的观点,只需代入其中,适度…

37-代码测试(下):Go语言其他测试类型及IAM测试介绍

。 Go中的两类测试:单元测试和性能测试。 我就来介绍下Go 语言中的其他测试类型:示例测试、TestMain函数、Mock测试、Fake测试等, 示例测试 示例测试以Example开头,没有输入和返回参数,通常保存在example_test.go…

Go语言实现Redis分布式锁2

项目地址: https://github.com/liwook/Redislock 1.支持阻塞式等待获取锁 之前的是只尝试获取一次锁,要是获取失败就不再尝试了。现在修改为支持阻塞式等待获取锁。 添加LockOptions结构体 添加option.go文件。 在LockOptions中 isBlock表示是否是阻塞模式blo…

美团一面:说说synchronized的实现原理?问麻了。。。。

引言 在现代软件开发领域,多线程并发编程已经成为提高系统性能、提升用户体验的重要手段。然而,多线程环境下的数据同步与资源共享问题也随之而来,处理不当可能导致数据不一致、死锁等各种并发问题。为此,Java语言提供了一种内置…

Pots(DFS BFS)

//新生训练 #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int, int> PII; const int N 205; int n, m; int l; int A, B, C; int dis[N][N];struct node {int px, py, op…