首页
学习
活动
专区
工具
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 进行优化。

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

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

相关·内容

转载:【AI系统】动态图与静态图转换

实现方式主流的 AI 框架最终目标是实现计算图的动静统一,目前从 AI 框架的技术趋势来看,动态图与静态图的融合在不断向前探索过程中:前端用户使用宿主语言(如 Python)中的控制流语句编写神经网络模型...基于源码解析以高级语言的抽象语法树(AST)作为输入,通过 AI 框架定义的计算图 IR 转化为框架内部的语法树,经过别名分析、SSA(static single value assignment)、类型推断等编译器中间件...基于源代码解析的方式则能够改善基于追踪转换的缺陷,其流程经历三个阶段:第一阶段:以宿主语言的抽象语法树(Abstract Syntax Tree, AST)为输入;对动态图模式下的宿主语言代码扫描进行词法分析...接着将宿主语言的抽象语法树,整理成一个 AI 框架内部的抽象语法树表示。...动态图转静态图的核心部分就是对抽象语法树进行转写,AI 框架中对每一个需要转换的语法都预设有转换器,每一个转换器对语法树进行扫描改写,将动态图代码语法映射为静态图代码语法。

8710

【AI系统】动态图与静态图转换

实现方式主流的 AI 框架最终目标是实现计算图的动静统一,目前从 AI 框架的技术趋势来看,动态图与静态图的融合在不断向前探索过程中:前端用户使用宿主语言(如 Python)中的控制流语句编写神经网络模型...基于源码解析以高级语言的抽象语法树(AST)作为输入,通过 AI 框架定义的计算图 IR 转化为框架内部的语法树,经过别名分析、SSA(static single value assignment)、类型推断等编译器中间件...基于源代码解析的方式则能够改善基于追踪转换的缺陷,其流程经历三个阶段:第一阶段:以宿主语言的抽象语法树(Abstract Syntax Tree, AST)为输入;对动态图模式下的宿主语言代码扫描进行词法分析...接着将宿主语言的抽象语法树,整理成一个 AI 框架内部的抽象语法树表示。...动态图转静态图的核心部分就是对抽象语法树进行转写,AI 框架中对每一个需要转换的语法都预设有转换器,每一个转换器对语法树进行扫描改写,将动态图代码语法映射为静态图代码语法。

11510
  • 如何训练最强代码大模型?北大aiXcoder-7B贡献前沿实践

    2024 年 4 月,aiXcoder 开源了自研代码大模型 aiXcoder-7B,成为这一领域的一次重要尝试,旨在将代码的抽象语法树(AST)结构与大规模预训练结合,以期提升模型对代码结构和上下文的理解能力...如上三行代码能够严格解析为抽象语法树格式 代码天然能被解析为抽象语法树,其语法规则严格组织了代码语句之间的关系。在语法规则之上,也有很多方式描述代码之间的流转关系,例如控制流图、调用流图等等。...顾名思义,控制流图会展示整个代码控制与条件关系,什么样的条件下哪个分支代码会运行。调用流图则展示的是代码之间的调用关系,实现一个功能时在什么样的地方调用什么样的代码模块是能展示出来的。...控制流图示例,代码执行条件与顺序会解析成流程图。...为此,团队结合语法分析方法,将代码解析为抽象语法树,并基于语法树的结构构建训练任务。具体而言,代码文件中的每个位置都对应着抽象语法树中的某个节点。

    11710

    编译原理:1. 绪论

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

    32350

    一篇文章理解编译全过程

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

    1.2K30

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

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

    96920

    JVM笔记-前端编译与优化

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

    46710

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

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

    68610

    codeql基础

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

    45430

    深入浅出JVM(六)之前端编译过程与语法糖原理

    : 程序编写的最小单位标记(token) : 编译的最小单位比如 关键字 static 是一个标记 / 6个字符语法分析: 将token流构造成抽象语法树填充符号表: 产生符号信息和符号地址符号表是一组符号信息和符号地址构成的数据结构比如...: 目标代码生成阶段,对符号名分配地址时,要查看符号表上该符号名对应的符号地址插入式注解处理器的注解处理注解处理器处理特殊注解: 在编译器允许注解处理器对源代码中特殊注解作处理,可以读写抽象语法树中任意元素...数据及控制流分析: 对程序运行时动态检查 - 比如方法中流程控制产生的各条路是否有合适的返回值 3....字节码生成: 生成**,**方法,并根据上述信息生成字节码文件前端编译流程图源码分析代码位置在JavaCompiler的compile方法中Java中的语法糖泛型将操作的数据类型指定为方法签名中一种特殊参数...token流,再将token流转换为抽象语法树,填充符号表的符号信息、符号地址,然后注解处理器处理特殊注解(比如Lombok生成get、set方法),对语法树发生写改动则要重新解析、填充符号,接着检查语义静态信息以及常量折叠

    10921

    编译与优化

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

    44420

    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.8K20

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

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

    65850

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

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

    1.4K20

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

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

    5.8K40

    Java编译原理(javac)

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

    1.5K10

    知识体系梳理2.0

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

    42420
    领券