angr里提供两种CFG的生成,一种是CFGFast,一种是CFGEmulated。这两种究竟有什么不同呢?

本文主要是用图来说明下这个问题。可能回答的不是很完整。

CFGFast这种CFG生成的比较快,但是没有考虑上下文关系。比如函数A调用了printf函数,函数B也调用了printf函数。就会变成下图的形式。

而CFGEmulated这种CFG则是考虑了上下文关系,上面的例子在CFGEmulated里就会变成下图的样子。

现在来实际看看angr生成的控制流图是什么样子的。针对以下C程序,我们来画CFGEmulated和CFGFast。

#include<stdio.h>
int A(){printf("hello world\n");
}
int B(){printf("hello");
}
int C(){printf("world");
}
int main()
{int a,b,c;scanf("%d%d%d",&a,&b,&c);if (a == 1){A();}else if (b == 1){B();}else{C();}return 0;}

angr生成CFG以及可视化CFG的代码如下:

import angr
from angrutils import *project = angr.Project("example/cfg",load_options={'auto_load_libs': False})cfg_emulated = project.analyses.CFGEmulated()
plot_cfg(cfg_emulated, "cfg_emulated", asminst=True, remove_imports=True, remove_path_terminator=True)cfg_fast = project.analyses.CFGFast()
plot_cfg(cfg_fast, "cfg_fast", asminst=True, remove_imports=True, remove_path_terminator=True)

CFGEmulated如下图所示:

CFGFast如下图所示:

可以看到CFGEmulated的三个分支的printf都单独提出来了。

而CFGFast中,可以看到printf节点的前继节点是B,C两个函数。

图解angr中两种CFG的区别相关推荐

  1. apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)

    搜索热词 对PHP在Apache中两种工作方式的区别(CGI模式.Apache 模块DLL)感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Windows 下有两种方法使 ...

  2. JSP中两种include的区别

    jsp中有两种include,一种是<%@include file="xxx.jsp"%>,另一种是<jsp:include page="xxx.jsp ...

  3. 微信开发中两种access_token的区别

    1. 普通的获取用户信息,只需要调用微信用户信息接口就能获取,因而使用的是第一种普通的access_token. 2. 网页授权时获取微信用户信息,用的就是第二种,网页授权access_token. ...

  4. 微信开发中两种access_token的区别和不同用处总结

    微信开发需要用到的access_token,其实是分为两个种类的,一种是普通的access_token,另一种是网页授权access_token. 普通的access_token,是微信开发者调用微信 ...

  5. SM中两种组件的区别----来自阿红

    Servicemix中有两类构件: 轻量级构件(也称为Pojo构件):实现了JBI规范中定义的构件必须实现的接口(Component和ComponentLifeCycle接口).轻量级构件不可以在运行 ...

  6. matlab 遍历每个像素点,Mat中两种像素遍历方法比较

    小白,入门中,不足其指正.刚刚接触opencv,从一个Matlab风格的编程环境突然跳转到C++,实在有些不适.单就pixels scanning花了好长时间研究.opencv-tutorials给出 ...

  7. Cesium 中两种添加 model 方法的区别

    概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...

  8. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  9. JavaScript中的ReferenceError和TypeError两种错误的区别

    转自JavaScript中的ReferenceError和TypeError两种错误的区别 作为前端工作人员,在调试JavaScript程序的时候经常遇到两个错误:ReferenceError和Typ ...

最新文章

  1. P6 根轨迹分析法-《Matlab/Simulink与控制系统仿真》程序指令总结
  2. ZooKeeper:win7上安装单机及伪分布式安装
  3. python里的os模块_python中os模块再回顾
  4. sqoop1.4.5 导入 hive IOException running import job: java.io.IOException: Hive exited with status 1
  5. Linux基础二(挂载、关机重启与系统等级)
  6. java方法报错_.setUndecorated 方法报错
  7. 面试官:你说对MySQL事务很熟?那我问你10个问题
  8. 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_轻量化 | 如何让笨重的深度学习模型在移动设备上跑起来?看它!...
  9. Java运行时的子类识别
  10. Kubernetes 网络部分
  11. 原子性 - synchronized关键词
  12. js 图片浏览插件原生
  13. 88个塑胶模具设计中常用知识点!
  14. java json转二进制数据_Json二进制数据
  15. WPF Binding绑定模式
  16. ubuntu死机咋办_Ubuntu死机解决方法汇总
  17. 阿里P9告诉你:P6-P10到底啥区别,别再傻傻分不清?怎样才能打怪晋级?
  18. Android Studio和SDK下载、安装和环境变量配置(全网最详细步骤)
  19. 抖音最新风控体系研究
  20. Mac装双系统的那些优缺点详解

热门文章

  1. 金融IT应小心陷入单纯追求技术目标的误区
  2. 金融机构的IT团队前置
  3. CGI, FCGI, SCGI, WSGI
  4. 《万能数据库查询分析器》创作人之2014年总结
  5. cisco硬件维修(交换机路由器防火墙模块电源维修)
  6. 长轮询和短轮询的区别
  7. MATLAB代码:基于模型预测控制的楼宇负荷需求响应研究
  8. MySQL数据库鼠标操作
  9. WEB-easy_upload
  10. 【Qt】QT鼠标和键盘事件