首先要知道Basic Block是什么。是一段线性程序,这段代码里面没有分支,只有一个入口和一个出口。划分basic blocks,首先要找到leaders(入口语句):

  • 程序的第一条语句
  • goto语句的目标语句(statement)。比如下面代码第6行?
  • goto后面紧跟着的语句。比如下面代码第8、10行?

然后就是根据leaders来划分basic blocks

  • 所有跟在leader后面到下一个leader出现前的语句
  • 第一个语句叫做first leader
  • 包含first leader的block叫做initial block

一个basic block只有一个入口,只能从这一个入口进到这个basic block里面并且执行它的代码

一个basic block只有一个出口,这个basic block里的最后一句跑完了之后就得去下一个basic block?

以下面的binary search 为例。如果按照这个划分,那下面iterativeBinarySearch的basic blocks就是(3-6), (7-8), (9-10), (11-12)?

Control-flow graph是一个流程图,它表示的是程序执行时候的顺序。CFG里面每个node都是一个basic block。下图就是用ida生成的上面的代码的control flow graph,这个graph里面每一个小方块都是一个basic block。

具体看看:

  1. 第一个basic block就是function开始的basic block。里面的 %rbp 是栈帧指针frame pointer,用于标识当前栈帧的起始位置。通常就是函数的起点了。
  2. while循环其实是source code的第三行,但在basic block里面却被拆开成了两个basic blocks。因为在while循环初始化阶段,会有start_index, end_index的初始化,就是第一个basic block里面的mov那几行。但它们只在while循环初始化的时候执行一次,因为后面在循环回来的时候,这些参数就已经设置好了,不能反复初始化。同理for loop也是一样的。
  3. 然后我们看右下角line13的block其实是exit basic block。起点的%rbp被pop出去了,代表这个函数就彻底结束了。有两条edge通向这个block,分别是从第6行和第12行出来的。因为6和12行都是return语句。
  4. source code第9行为什么没有出现在图里呢?因为这个代码其实是我写的,个人习惯把else后面接的命令另起一行。其实把第9,10行合并成一行也是可以的。所以在现有的代码下,9行的else就是一个edge,并不是一个basic block。

Basic Blocks相关推荐

  1. 【论文分享】WindRanger: A Directed Greybox Fuzzer driven by Deviation Basic Blocks

    论文基本信息 发表年份:2022 发表会议或期刊(简称,CCF级别):CCF A类会议 ICSE 论文标题(论文简称):WindRanger: A Directed Greybox Fuzzer dr ...

  2. Basic Block

    WIKI里面对BB的解释: http://en.wikipedia.org/wiki/Basic_block GCC文档对BB的解释: http://gcc.gnu.org/onlinedocs/gc ...

  3. 三段式LLVM编译器

    三段式LLVM编译器 目录 概述 LLVM技术生态之编译器 一.传统编译器的设计 二.传统编译器模式的实现 三.LLVM的三段式实现 四.LLVM's Code Representation:LLVM ...

  4. 编译器设计-代码优化

    编译器设计-代码优化 Compiler Design - Code Optimization 优化是一种程序转换技术,它试图通过使代码消耗更少的资源(如CPU.内存)来改进代码,并提供高速. 在优化中 ...

  5. 深入理解SERDES接口

    http://blog.sina.com.cn/s/blog_aec06aac01013m5g.html 理解SerDes www.blog.sina.com.cn/fpgatalk FPGA发展到今 ...

  6. linux工具之检测内存泄漏-valgrind

    0.前言 内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏: valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项 ...

  7. Paper:《Graph Neural Networks: A Review of Methods and Applications》翻译与解读

    Paper:<Graph Neural Networks: A Review of Methods and Applications>翻译与解读 目录 <Graph Neural N ...

  8. Windows环境下Pin(二进制动态插桩引擎)搭建

    文章目录 安装包下载链接: 环境配置 编译Pintool 报错1(无法打开包括文件:"xed-iclass-enum.h":No such file or directory): ...

  9. 代码环复杂度的计算公式

    i042416 commented on Feb 17, 2017 来了解一下软件工程中代码环复杂度的定义. the cyclomatic complexity of a program is def ...

  10. Android 沙箱开源,Android Sandbox(沙箱)开源工具介绍

    原文:http://blog.csdn.net/jiayanhui2877/article/details/8120533 ndroid sandbox 通过利用开源工具动态分析.静态分析androi ...

最新文章

  1. 2020这一年,我完成了这几件大事
  2. 25条实用的Python一行代码,你用过哪些?
  3. (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新
  4. bd3.2 Python高级
  5. CososJS学习笔记(1) 环境配置(填坑版,让你少走弯路!)
  6. PostgreSQL中如何查看一个表所对应的文件
  7. OpenGL画简单图形
  8. Apache 虚拟主机的配置[Ubuntu]
  9. 中信银行就泄露池子个人信息致歉,网友:违法行为想靠道歉就完事?
  10. 打开visio后屏幕会不停的抖动是怎么回事
  11. android u盘加密代码,怎么用安卓手机给u盘加密
  12. 三款 Mac 远程控制(远程桌面)工具
  13. @submit.native.prevent
  14. 用计算机网络专业说一句情话,用你的专业,说一句情话!
  15. 秒换算 天 时 分 秒
  16. CSS 3之图文混排效果
  17. 计算机操作系统 - 概述
  18. 容器安全03:NIST.SP.800-190容器安全指南
  19. C++知识点(2022.11.26~2023.1.31已完结)
  20. lemur代码分析之入口设计

热门文章

  1. 【VBox】解决复制VBox虚拟机后提示硬盘UUID 已经存在的问题
  2. unity 老版本 离线下载
  3. JMX 和 管理系统简介(一)
  4. 计算机知识动画片,这些好看的动画片里竟然藏着许多知识点!(内附2019年观影日历)...
  5. 惊艳!ftrack和UE4,强强联合!
  6. php 字符c二进制文件内容,科学网—C读写二进制文件与文本文件 - 张凌的博文
  7. android power 按键,android 添加按(power键)电源键结束通话(挂断电话)
  8. 本地电脑连接阿里云RDS云数据库
  9. 【论文精读】Grounded Language-Image Pre-training(GLIP)
  10. SuperMap iClient3D for WebGL教程 水面特效制作