首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从抽象语法树获取控制流图

控制流图(Control Flow Graph, CFG)是一种图形化表示编程语言中控制流结构的方法。它反映了程序源代码中各种基本结构之间的流程控制关系。

CFG 通过遍历抽象语法树(Abstract Syntax Tree,AST)构建而来。AST 用于描述源代码的语法结构,包括各类字面量、表达式、语句、函数调用等。

  1. 抽象语法树(AST):一种源代码语法结构的树形表示。使用语法分析器(Parser)将源代码转换成 AST,然后进一步构建 CFG。
  2. 谓词-义务图(Predicate-Obligation Graph,PAG):一种用于表示程序静态性质的图形化表示方法。将抽象语法树中定义的所有谓词和它们对应的所有义务(obligations)表示为一个依赖图。
  3. CFG 构建:遍历和计算 AST 中每个节点的语法和语义属性,然后递归构造控制流图。CFG 可能包含多个入口、出口、循环和标签节点。此外,还需要确保所有基本路径有相同的控制流形状。
  4. CFG 优化:根据控制流和输入变量的不稳定性,使用静态单赋值(SSA)等技术对 CFG 进行优化。

通过获取从抽象语法树中构建的控制流图,可以全面地理解编程语言中的流程控制结构,从而进行代码分析、重构、优化等工作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

编译原理:1. 绪论

抽象语法(Abstract Syntax)、IR(IR Tree)和汇编(Assem)之类的接口是数据结构的形式。例如语法分析动作阶段建立抽象语法数据结构,并将它传递给语义分析阶段。...简单的编译器通常没有专门的控制分析、数据分析和寄存器分配。...---- 1.3 编译过程 ---- 大致地,编译器编译一个语言源程序的过程如下: 顺序 阶段 描述 1 词法分析 将源文件分解为一个个独立的单词符号 2 语法分析 分析程序的短语结构 3 语义动作 建立每个短语对应的抽象语法...,这是一种与任何特定程序设计语言和目标机体系结构无关的表示 7 规范化 提取表达式中的副作用,整理条件分支,以方便下一阶段的处理 8 指令选择 将IR结点组合成与目标机指令相对应的块 9 控制分析...分析指令的顺序并建立控制,此图表示程序执行时可能流经的所有控制 数据分析 收集程序变量的数据信息,例如,活跃分析(liveness analysis)计算每一个变量仍需使用 其值的地点(即它的活跃点

30250

一篇文章理解编译全过程

语法分析 每一个程序代码,实际上可以通过这种结构表现出其语法规则。 语法分析阶段把Token串,转换成一个体现语法规则的、树状数据结构,即抽象语法AST。 AST反映了程序的语法结构。...AST抽象语法 AST长成什么样,由语法的结构有关。 比如 上面C语言代码中对函数的语法定义如下:语法分析器就按照语法定义进行解析,就是从上到下匹配的过程。...实现AST的解释器:在语法分析后有了程序的抽象语法,在语义分析后有了“带有标注的AST”和符号表后,就可以深度优先遍历AST,并且一边遍历一边执行结点的语义规则。整个遍历的过程就是执行代码的过程。...代码优化 一种方案:基于基本块作代码优化 分类:本地优化、全局优化、过程间优化 本地优化:可用表达式分析、活跃性分析 全局优化:基于控制CFG作优化。...控制CFG :是一种有向,它体现了基本块之前的指令流转关系,如果BLOCK1的最后一条指令是跳转到 BLOCK2, 就连一条边,如果通过分析 CFG,发现某个变量在其他地方没有被使用,就可以把这个变量所在代码行删除

1.1K30

(23)恶意代码作者溯源(去匿名化)经典论文阅读:二进制和源代码对比

方法对比突出本文贡献: Rosenblum经典工作:可以直接可执行二进制文件中提取控制等结构,首次针对二进制代码提出一种自动检测代码风格特征的方法并确定程序作者 本文工作:首次证明可执行二进制文件的自动反编译...按照Rosenblum方法可执行二进制中提取原始指令轨迹,同时反汇编程序会提供符号信息以及代码中引用的字符串,再从反汇编器中获得函数的控制,提供基于程序基本块的特征。...The radare2 disassembler:从动态和静态符号表中提取符号并获得动态库函数知识,生成相应的控制。...同时,本文通过两种不同的反汇编器、控制和一个反编译器,获得了这种编码样式的精确表示,有效提取53个关键特征。...,其中通过抽象语法提取语法特征,词汇特征和布局特征源代码中统计获得。

83820

JVM笔记-前端编译与优化

填充符号表:产生符号地址和符号信息 插入式注解处理器的注解处理过程 分析与字节码生成过程 标注检查:对语法的静态信息进行检查 数据控制分析:对程序的动态运行过程进行检查 解语法糖:将简化代码编写的语法糖还原为原来的样子...语法分析 根据上面的标记序列构造抽象语法的过程。...这个阶段主要是根据上一步生成的抽象语法列表完成符号填充,返回填充了类中所有符号的抽象语法列表。...2.3 语义分析与字节码生成 抽象语法能表示一个结构正确的源程序,却无法保证语义是否符合逻辑。 而语义分析就对语法正确的源程序结合上下文进行相关性质的检查(类型检查、控制检查等)。...,语义分析过程可分为标注检查和数据及控制分析两个步骤。

45010

codeql基础

数据依赖传播 即 显式信息 控制依赖传播 即 隐式信息 比如 if (x > 0) y = 1; else y = 0; y的值由x的值影响决定,若x为污染信息,y也是污染信息...AST抽象语法 源代码------》》》》 转换为 -----》》》》 AST 抽象语法 abstract syntax  code  AST,是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构...,抽象语法并不会表示出真实语法出现的每一个细节,例如 嵌套括号被隐含在的结构中,并没有以节点的形式呈现。...因些,很多编译器经常要独立地构造语法分析,为前端,后端建立一个清晰的接口。 抽象语法在很多领域有广泛的应用,比如浏览器,智能编辑器,编译器。...抽象语法实例 局部看起,从下网上看 迭代 消除左递归 递归分为立即左递归和非立即左递归

41430

AST 初探深浅,代码还能这样玩?!

我们今天的主题是 AST (抽象语法) AST 听起来好像是个很新的东西,那么具体有什么用,好不好用就在这篇文章中找到答案吧~ 我们简单将这个词拆分抽象语法,如果我们能够顺利将这个词拆分,那么我们也就掌握了其核心所在...抽象抽象的反义词是具象,也就说明抽象的事物关注点不在于细节,而在于整体 语法语法一组词法的表达式,具备某种指定的规则,具有某种特定的意义,比如 1+1 是一种一对多的结构,通过根节点往下递生...AST(抽象语法)并没有我们所想的那么神秘,它是源代码语法结构的一种抽象表示,它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 2. 它有什么特征?...,我们已经拿到了各个 token, 也就是 token ,也就是接下来我们就可以对 token 进行语法分析,比如我们第一个遇到的 token 是 const ,语法分析器通过分析,判断它是一个 声明参数...持续语句 通常指 continue ReturnStatement 返回语句 通常指 return SwitchStatement Switch 语句 通常指 switch IfStatement If 控制语句

64010

编译与优化

2)解析与填充符号表过程,包括: 词法、语法分析。将源代码的字符流转变为标记集合,构造出抽象语法。·填充符号表。产生符号地址和符号信息。...对语法的静态信息进行检查,数据控制分析。对程序动态运行过程进行检查。 解语法糖。将简化代码编写的语法糖还原为原有的形式。 字节码生成。将前面各个步骤所生成的信息转化成字节码。...我们可以把插入式注解处理器看作是一组编译器的插件,当这些 插件工作时,允许读取、修改、添加抽象语法中的任意元素。...如果这些插件在处理注解期间对语法 进行过修改,编译器将回到解析及填充符号表的过程重新处理,直到所有插入式注解处理器都没有 再对语法进行修改为止,每一次循环过程称为一个轮次(Round),这也就对应着...如本章概述中所说的,在前端编译器中,“优化”手段主要用于提升程序的编码效率,之所以把Javac这类将Java代码转变为字节码的编译器称作“前端编译器”,是因为它只完成了程序到抽象语法或中间字节码的生成

42520

JavaScript 混淆与逆向必读之 AST 节点类型名词基础

这里引用百度百科对 AST 的解释: 在计算机科学中,抽象语法(Abstract Syntax Tree,AST),或简称语法(Syntax tree),是源代码语法结构的一种抽象表示。...以下是 JavaScript 语句和语法的对应关系: ? 有点模糊,想看清晰结构的请移步 AST Explorer。 AST 有什么用?...这说明一键混淆/还原工具通过改变原代码的抽象语法实现混淆/还原的效果,例如在的某个节点前后增加或删除节点,亦或在混淆时将原本直接可以输出结果的单个函数转换为相互调用的多个函数。...上图代码包含了 JavaScript 语法中常用的语句,例如变量声明、函数声明、三元表达式、if 控制语句、switch 控制、函数调用、赋值语句、数组声明、for 循环等。...控制语句,通常指 if(condition){}else{} 11 Identifier 标识符 标识,例如声明变量时 var identi = 5 中的 identi 12 CallExpression

1.7K20

图灵奖得主、《龙书》作者万字长文讲解:什么是「抽象」?

这种类型的其他示例包括堆栈、队列、优先级队列,以及许多其他抽象。 其他抽象非常广泛,可以支持应用程序的大型组件。常见的例子包括各种各样的,例如有向、无向、有标签和无标签。...编译器实现的进展涉及许多重要的抽象。我们将具体讨论三种这样的抽象:正则表达式、上下文无关文法和。前两个是带有有趣优化故事的声明性抽象。第三个虽然不是声明性的,但也带来了有趣的实现挑战。...该表达式被转换为确定性有限自动机,读取字符,直到找到与标记匹配的字符串前缀,然后删除输入中读取的字符,将该标记添加到输出中,并重复该过程。...例如,虽然看起来像一个标识符,但它实际上是一个用于程序中控制的关键字。因此,当看到这个字符序列时,词法分析器必须返回标记,并非。...2. 表达式 a + b * c 的语法 2.2 上下文无关文法和语法分析   编译器的第二个阶段,语法分析器或「解析器」将词法分析器生成的标记序列映射为树状表示,从而明确标记序列中的语法结构。

62650

Java文件是怎么编译成Class文件的

真正完成解析的是 JavaTokenizer.java的readToken();方法 2语法分析器 根据Token集合生成抽象语法抽象语法(Abstract Syntax Tree,AST)是一...上述这段代码生成的抽象语法如下( IDEA JDT AstView 插件可以查看抽象语法): 上述抽象语法在Java中使用com.sun.tools.javac.tree.JCTree类来表示...经过词法和语法分析生成语法以后,编译器就不会再对源码字符流进行操作了,后续的操作都建立在抽象语法之上。...,将比较复杂的语法语义转化成简单的语法,譬如进行变量类型检查、控制检查、数据检查。...对我们刚刚生成那颗抽象语法解析进行变量类型检查、控制检查、数据检查,解语法糖。 解语法糖 通常来说使用语法糖能够减少代码量、增加程序的可读性,从而减少程序代码出错的机会。

1.3K20

Java编译原理(javac)

前端编译 前端编译大致主要有以下流程: 对源文件进行词法分析产生字符 对字符流进行语法分析产生抽象语法语法进行语义分析,确保语义正常 语义分析通过以后生成中间代码(字节码) 下面我们站在javac...2.1.2 语法分析 根据Token集合生成抽象语法语法是一种用来表示程序代码语法结构的表现形式,语法的每一个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符。...上述这段代码生成的抽象语法如下(IDEA JDT AstView插件可以查看抽象语法): ?...上述抽象语法在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法之上。...4.1.2 数据及控制分析 数据及控制分析是对程序上下文逻辑进行验证,检查局部变量是否在使用前已经赋值、方法的每条路径都有返回值、所有的受检查异常是否被正确处理。

1.5K10

将JavaScript代码转换为漂亮的SVG流程——js2flowchart

js2flowchart的特性以及适用场景(来自官网翻译) js2flowchart获取您的JS代码并返回SVG流程,适用于客户端/服务器,支持ES6。...主要特点: 定义抽象级别以仅渲染导入/导出,类/函数名称,函数依赖性以逐步学习/解释代码。...自定义抽象级别支持创建自己的抽象级别 表示生成器,以生成不同抽象级别的SVG列表 定义修改器以映射众所周知的API,例如[] .map,[]。...销毁修饰符,用于在方案上用一个形状替换代码块 自定义修改器支持创建自己的修改器 忽略过滤器完全省略一些代码节点,如日志行 聚焦节点或整个代码逻辑分支突出显示方案的重要部分 模糊节点或整个代码逻辑分支以隐藏不太重要的东西...定义的样式主题支持选择您喜欢的样式 自定义主题支持创建自己的主题,更好地适合您的上下文颜色 自定义颜色和样式支持提供方便的API来更改特定样式而无需样板 用例场景: 通过流程图解释/记录您的代码 通过视觉理解学习其他代码 为有效JS语法简单描述的任何进程创建流程

5.6K40

我们期待的TensorFlow 2.0还有哪些变化?

.* API 手动的将抽象语法)拼接在一起。然后,它要求用户将一组输出张量和输入张量传递给 session.run() 调用,来手动编译抽象语法。...相比之下,TensorFlow 2.0 executes eagerly(如正常使用 Python 一样)在 2.0 的版本中,其 graphs(抽象语法)和 sessions 在实现的细节上应该是一样的...如果您想使用 AutoGraph 的等效操作替换 Python 循环,可以通过将代码包装在 tf.function() 中,充分利用数据集异步预取 / 功能来实现。...提供了一种将依赖于数据的控制流转换为模式等价的方法,如 tf.cond 和 tf.while_loop。...数据相关控制常见出现于序列模型中。tf.keras.layers.RNN 包装了 RNN 单元,允许您静态或动态地展开循环神经网络。

1.1K30

知识体系梳理2.0

Assist Tabnine(Codata) Copilot Java基础: 基础语法和面向对象 标识符合保留字 数据类型 流程控制 OOP:封装、继承、多态 抽象类与接口 浅拷贝与深拷贝 Java引用...)单实例,唯一实例 结构型模式 适配器模式(Adapter)转换、兼容接口 桥接模式(Bridge) 继承拆分,抽象和实现分离, 将类的抽象部分和实现部分分开 组合模式(Composite)整体-部分...(运行状态、维护状态、停站状态) 活动:将进程或其他计算结构展示为计算内部一步步的控制和数据,是一种动态视图,强调对象之间的控制流程。 部署:描述对运行时的处理节点及在其中生存的构件的配置。...二叉、BST、AVL、红黑、B、B+ 堆:二叉堆、小顶堆、大顶堆 :有向、无向、简单、完全无向、 有向完全、有向无环 散列表:函数构造、 冲突处理、 命中查找 字符串:查找匹配、...正则、 数组、 链表、 栈、 队列 :二叉、B Tree/B+ Tree、 红黑 哈希:哈希冲突、K-V :BFS、DFS 排序: 内部排序 :插入排序、直接插入排序、希尔排序 选择排序:简单选择排序

39120

软件工程模型-架构师之路(四)

软件生命周期是一个 二维软件开发模型,有9个核心工作。 业务建模、需求、分析与设计、实现、测试、部署、配置与变更管理、项目管理和环境。 RUP开发生命周期有多个循环,每次循环由四个阶段组成。...工作:when的问题。连续的需求工作。 RUP特点: 1、用例驱动:需求分析、设计、实现和测试等活动都是用例驱动。 2、以体系结构为中心:包括系统的总体组织和全局控制。典型4+1试图模型。...分为四个级别: 实现级:包括程序的抽象语法、符号表和过程的设计表示。 结构级:依赖关系,如调用、结构图、程序和数据结构。 功能级:程序功能及程序段关系的信息,数据和控制模型。...领域级:如E-R,领域概念之间关系。 领域级最抽象,完备最低。实现级不抽象,完备性最高。 重构、设计恢复、再工程和正向工程。 重构:同一抽象级别转换系统描述形式。...设计恢复:已有的程序中抽象出有关数据设计。 正向工程:使用该信息去改变或重构现有系统。

26230
领券