南大《软件分析》——Intermediate Representation

@(静态分析)

Content

  1. 编译器和静态分析的关系

  2. AST vs IR

  3. IR:3-地址代码(3AC)

  4. 实际静态分析器的3AC—Soot(Java)

  5. SSA-静态单赋值

  6. 基本块(BB)

  7. 控制流图(CFG)

Compiler and Static Analyzers

中间表示形式IR(通常是三地址码)之后进行静态分析,优化,检查。

IR是提供给静态分析程序的基础。

编译基本流程

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间代码生成
  • 代码优化
  • 代码生成

AST vs IR

AST IR
更高级,接近语法结构 更底层,接近汇编
依赖语言 不依赖语言
适用于快速类型检查 压缩简洁
缺乏控制流信息 包含控制流信息

通常认为IR是静态分析的基础

Intermediate Representation

三地址码(3-Address Code)

中间表示形式,右侧最多只有一个操作符

  • Address:

    • Name:a、b
    • Constant: 3
    • 编译器的临时变量:t1、t2

实际静态分析器的3AC—Soot(Java)

Soot

https://github.com/Sable/soot

https://github.com/Sable/soot/wiki/Tutorials

最常用的Java静态分析框架

invokespecial: call constructor, call superclass methods, call private methods
invokevitual: instance methods call(virual dispath)
invokeinterface: cannot optimization, checking interface implementation
invokestatic: call static methods Java7: invokedynamic -> Java static typing , dynamic language runs on JVM #让动态语言在JVM上运行 method signature: class name : return type method name(parameter1 parameter2)

SSA-静态单赋值

给每一个定义变量一个新的命名,传递到接下来的使用当中,每个变量有一个定义(赋值的目标变量)。

每一个变量都有自己的定义

merge的地方会使用Phi funciton

优点:

  • 程序流信息可以间接包含进独一无二的变量名。通过SSA,流不敏感分析方法可以获得部分流敏感分析方法所带来的精度。
  • Define- and-Use清晰明显

缺点:

  • 引入的变量和Phi function过多
  • 转换为机器码时效率变低(引入很多拷贝操作)

基本块(BB)

只有1个开头入口和1个结尾出口的最长连续的3-地址指令序列。

识别基本块的算法:首先确定入口指令,第一条指令是入口;任何跳转指令的目标地址是入口;任何跟在跳转指令之后的指令是入口。然后构造基本块,任何基本块包含1个入口指令和其接下来的指令。

控制流图(CFG)

基本块作为节点

添边规则:

  • A的结尾有跳转指令到B
  • 原始指令序列中,B紧跟着A,且A的结尾不是无条件跳转。

将原本的语句变为BB再变成CFG

南大《软件分析》课程笔记——Intermediate Representation的更多相关文章

  1. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  2. Coursera台大机器学习技法课程笔记11-Gradient Boosted Decision Tree

    将Adaboost和decision tree相结合,需要注意的地主是,训练时adaboost需要改变资料的权重,如何将有权重的资 料和decision tree相结合呢?方法很类似于前面讲过的bag ...

  3. linux内核分析课程笔记(二)

    运行一个精简的操作系统内核 存储程序计算机是几乎所有计算机的基础逻辑框架. 堆栈是计算机中非常基础的东西,在最早计算机没有高级语言时,在高级语言出现之前,我们没有函数的概念.但高级语言出现后有了函数调 ...

  4. Coursera台大机器学习技法课程笔记03-Kernel Support Vector Machine

    这一节讲的是核化的SVM,Andrew Ng的那篇讲义也讲过,讲的也不错. 首先讲的是kernel trick,为了简化将低维特征映射高维特征后的计算,使用了核技巧.讲义中还讲了核函数的判定,即什么样 ...

  5. Coursera台大机器学习技法课程笔记01-linear hard SVM

    极其淡腾的一学期终于过去了,暑假打算学下台大的这门机器学习技法. 第一课是对SVM的介绍,虽然之前也学过,但听了一次感觉还是很有收获的.这位博主总结了个大概,具体细节还是 要听课:http://www ...

  6. Coursera台大机器学习技法课程笔记05-Kernel Logistic Regression

    这一节主要讲的是如何将Kernel trick 用到 logistic regression上. 从另一个角度来看soft-margin SVM,将其与 logistic regression进行对比 ...

  7. Coursera台大机器学习技法课程笔记10-Random forest

    随机森林就是要将这我们之前学的两个算法进行结合:bagging能减少variance(通过g们投票),而decision tree的variance很大,资料不同,生成的树也不同. 为了得到不同的g, ...

  8. Coursera台大机器学习技法课程笔记08-Adaptive Boosting

    将分类器组合的过程中,将重点逐渐聚焦于那些被错分的样本点,这种做法背后的数学原因,就是这讲的内容. 在用bootstraping生成g的过程中,由于抽样对不同的g就生成了不同的u,接下来就是不断的调整 ...

  9. Coursera台大机器学习技法课程笔记14-Radial Basis Function Network

    将Radial Basis Function与Network相结合.实际上衡量两个点的相似性:距离越近,值越大. 将神经元换为与距离有关的函数,就是RBF Network: 可以用kernel和RBF ...

随机推荐

  1. Matrix Analysis and Application

    Chap 1: Linear Equations and Matrix Linear equations Gaussian elimination Pivot; Triangularize; Back ...

  2. v-for为什么最好(一定)要加key

    v-for 指令基于一个数组来渲染一个列表,如下 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> ...

  3. mysql从零开始之MySQL 管理

    MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...

  4. C#开发BIMFACE系列40 服务端API之模型集成

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 随着建筑信息化模型技术的发展,越来越多的人选择在云端浏览建筑模型.现阶段的云端模型浏览大多是基于文件级别,一次只可以浏览一 ...

  5. 第一个Java HelloWorld

    步骤 1.在记事本或者notePad++中编写java代码 public class Hello { public static void main(String[] args){ System.ou ...

  6. 【UE4 C++】Slate 初探: Editor UI 与 Game UI

    概述 名词区分 Slate Slate 是完全自定义.与平台无关的UI框架 应用 可用于编辑器UI,编辑器的大部分界面都是使用 Slate 构建的 可做为游戏UI 可作为独立应用开发 只能 C++ 开 ...

  7. 【二食堂】Beta - Scrum Meeting 4

    Scrum Meeting 4 例会时间:5.17 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续完成文本区域划词添加的功能 issue 1. 划词功能已经实现,继续开发 ...

  8. 【二食堂】Alpha - 项目展示

    项目展示 1. 团队介绍 二食堂很难排队 姓名 介绍 职务 刘享 热爱游戏,尤其是RPG和metrovinia类的游戏. 会C/C++, python, java. 后端 左正 一个普通的大学生,Py ...

  9. 升级MySQL8.0的历险记

    最近忙于Fighting的项目,所以笔耕有些松懈,实为不该. 刚好遇到需要从MySQL5.7.33升级到MySQL8.0.x的需求,于是记录一下整个升级过程,踩坑而过. 背景梗概:本地docker容器 ...

  10. 零基础入门C/C++实现你的浪漫表白:浪漫流星雨表白程序

    想要讨女朋友欢心也巩固自己所学的知识,各位小伙伴有自己的想法了吗?准备好想要怎样实施了吗?有什么美好的计划了吗?如果没有的话那么别慌,我知道,在座的各位肯定都是有自己的心仪的姑娘,那么今天就教大家一招 ...