概要

本篇文章会介绍为什么需要控制流图,现存的一些开源实现和自己写的实现,以及实现中遇到的问题和解决方案。

为什么需要控制流图

控制流图清晰地表示了程序执行时的可能路径。它有很多应用,比如数据流分析。因为数据流分析的第一步是建立一个与之对应的控制流图。 另外,它可以帮助程序初学者理解程序逻辑。 本文基于Python讲述如何生成对应的控制流图。

开源的控制流生成器

如下列举了几款搜索到的控制流图生成器,一些是专门用来生成控制流的,一些是作为一个模块嵌套的并可以取出来单独用到的。

pycfghttps://github.com/vrthra/pycfgstaticfghttps://github.com/coetaur0/staticfgCFG-Generatorhttps://github.com/Tiankai-Jiang/CFG-Generatorpythttps://github.com/python-security/pytpy2cfghttps://gitlab.com/classroomcode/py2cfg以上这些是针对Python抽象语法树来生成控制流的。

pytypehttps://github.com/google/pytypepython-control-flowhttps://github.com/rocky/python-control-flow以上这些是针对Python字节码来生成控制流的。

本人正在开发的控制流图生成器

py2flowshttps://github.com/LayneInNL/py2flows

因为本人随后的论文要用到基于抽象语法书生成的控制流图,但是现有实现都存在一些问题,比如他们只是大致生成控制流图,缺少对某些语言特性的支持。还有图中每个节点的粒度可能很粗,这导致数据流分析会非常困难。所以本人另外开发了一款针对Python的控制流图生成器。当前这个程序还不是特别完善,因为里面存在一些缺陷和我打算支持所有Python抽象语法节点类型。

实现中遇到的问题

1. Python的ast.NodeTransformer的局限性

根据文档,NodeTransformer只能修改一个节点并返回一个节点。这就导致如果你有一个Node n1,想生成两个Node n2,n3是不可能的。前几天我在stackoverflow发了一个问题,有兴趣可以看下。

我当前的实现是在遍历树的同时另外维护一套抽象语法树。

How to use ast.NodeTransformer to transform List Comprehensions to For Loops?https://stackoverflow.com/questions/71374504/how-to-use-ast-nodetransformer-to-transform-list-comprehensions-to-for-loops

2. 解构复杂语句为简单语句

给个例子,比如我们遇到了一个表达式

# Attribute(expr value, identifier attr, expr_context ctx)
a.b.c.d

如果不解构此语句,数据流分析会非常复杂。怎么办呢?利用递归把此语句分成简单语句。

x = a.b
y = x.c
y.d

3. 表达式(Expression)和语句(Statement)的细微差别

举个例子

a = test(a+1, b+1)the control flow graph is:tmp1 = a+1
-> tmp2 = b+1
-> # spurious test(tmp1, tmp2)
-> a = test(tmp1, tmp2)test(a+1, b+1)the control flow graph is:tmp1 = a+1
-> tmp2 = b+1
-> test(tmp1, tmp2)

如果按照表达式的方式处理语句,那么会导致多生成一个节点:spurious test(tmp1, tmp2). 这个节点没有任何作用,我当前的处理方式是吧表达式转换成语句比如赋值语句(赋给一个临时变量),然后利用语句的特性处理表达式。

进一步思考

  1. 表达式和语句的区别是什么?
  2. 因为我针对Python 3.7开发,如何支持多种版本的抽象语法树?
  3. 如何使用临时变量,才能保证不和原始程序内的变量名称冲突?

对Python控制流图生成器的一些探索相关推荐

  1. eclipse控制流图插件——CFG生成器的安装

    目录 1.安装步骤 2.使用方法 我们知道,在单元测试过程中,代码的控制流图可以辅助我们更方便的设计用例来覆盖代码. 控制流图可以根据代码手工绘制,也可以使用工具生成,这里,我就带大家借助eclips ...

  2. python控制单片机keil_PCF8591使用及Python控制

    PCF8591使用及Python控制 INTRODUCTION 大家一定对于PCF8591芯片,对于其中的A0.A1.A2.channel0-channel3.AIN0-AIN3.AOUT.SCL.S ...

  3. python迭代器与生成器答案_史上最全 Python 迭代器与生成器

    原标题:史上最全 Python 迭代器与生成器 作者:浪子燕青 链接:http://www.langzi.fun/迭代器与生成器.html 迭代器与可迭代对象 概念 迭代器:是访问数据集合内元素的一种 ...

  4. python 列表生成器放while_史上最全 Python 迭代器与生成器

    原标题:史上最全 Python 迭代器与生成器 转自:浪子燕青 http://www.langzi.fun/迭代器与生成器.html 概念 迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但 ...

  5. Python 控制 Raspberry Pi 云台多舵机

    多舵机控制,使用 Python 和云台机制构造进行 Raspberry Pi 相机定位. 所需材料 在本教程中,我们将探索如何在 Raspberry Pi 上使用 Python 控制多个舵机.我们的目 ...

  6. python小说自动生成器_python- generator生成器

    什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后 ...

  7. python代码:生成器

    python代码:生成器 本人的话:原书只写了生成器,没有写生成器表达式.可能是书太古老了.还需要查资料看看生成器表达式,这样有关生成器的知识才算是完整的. #!/usr/bin/python # - ...

  8. python基础(迭代器,生成器,装饰器)

    python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...

  9. 简单介绍python迭代器和生成器

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,需要的朋友可以参考下,希望能够给你带来帮助 python迭代器和生成器 1.迭代器 这里用字典示例 while T ...

最新文章

  1. 【java】兴唐第十九节课(内部类)
  2. 自创数据集,用TensorFlow预测股票教程 !(附代码)
  3. JAVA调用R语言之Rserve
  4. 数据增删改查之三层架构(理解三层续)
  5. fft 相位谱_FFT和示波器实用指南——深圳零式未来仪器科技
  6. 如何在ASP.NetCore增加文件上传大小
  7. 输入输出Fibonacci数
  8. 计算机组成微程序操作码怎么写,计算机组成原理学习笔记——控制器
  9. jq toggle()方法学习
  10. HNOI2008 遥远的行星
  11. Atitit 常用微服务实现 目录 1. 健康检测 max_fails与fail_timeout参 数 1 1.1. spring cloud dubbo实现 2 1.2. 、nginx多个tomc
  12. netconsole 重定向kernel日志到远程服务器
  13. 查看服务器虚拟机版本,查看虚拟机版本命令
  14. 惠普计算机硬盘序列号怎么查询,硬盘序列号怎么看 【设置办法】
  15. steam加速_《盗贼之海》发行之初荣登Steam榜首,UU加速器为您开黑提供保障
  16. #蓝桥杯嵌入式#电路模电基础知识
  17. 如何缩小jpg图片大小kb?手机照片怎么压缩大小?
  18. 脸部识别是根据什么识别的_我们需要知道面部识别失败的频率
  19. 5种录制Windows 10 音频的方法
  20. 膜拜,阿里内部都在学习的五大深入理解Java虚拟机PDF,简直强无敌

热门文章

  1. 图像恢复(加噪与去噪)
  2. mysql table plugin,MySql报错Table mysql.plugin doesn’t exist的解决方法
  3. 【01】花卉识别-基于tensorflow2.3实现
  4. 数据清洗是清洗什么?
  5. C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者...
  6. 使用Cython提高python代码执行速度
  7. Android USB编程
  8. 如何修改Windows上Docker的镜像源
  9. 基恩士协议转换网关WTGNet-KV
  10. matlab实现模糊控制器并仿真,用Matlab实现空调温度模糊控制器的设计与仿真