插桩功能由ModuleAddressSanitizer::instrumentModule实现。这是个模块插桩,主要以全局变量插桩为主,也包括ASAN其它功能中所需的模块插桩功能。这里主要关注全局变量的处理。

在此之前,编译器前端(parseSanitizerKinds())会识别-fsanitize=address标识,在Sanitizer类型集合中记录当前是AddressSanitzer。CodeGen会开启一个将全局变量元数据传给ASan的功能(SanitizerMD->reportGlobalToASan()),这些元数据记录了源码位置、是否动态初始化等信息。

主要步骤包括:

  1. 将原来的全局变量转变成一个结构体,内部包含了原来的全局变量和一个右Redzone,将原来被使用的全局变量替换(replaceAllUsesWith)成新的结构体内的全局变量,之后将所有的新全局变量结构体通过调用__asan_register_globals进行poison
  2. 构建asan.module_ctorctor函数),优先级为1。IR代码如下。里面除了有__asan_register_globals,还有必要的ASAN初始化函数__asan_init
define internal void @asan.module_ctor() {call void @__asan_init()call void @__asan_version_mismatch_check_v8()call void @__asan_register_globals(i64 ptrtoint ([4 x { i64, i64, i64, i64, i64, i64, i64, i64 }]* @0 to i64), i64 4)ret void
}
  1. 构建asan.module_dtor
define internal void @asan.module_dtor() {call void @__asan_unregister_globals(i64 ptrtoint ([4 x { i64, i64, i64, i64, i64, i64, i64, i64 }]* @0 to i64), i64 4)ret void
}
  1. 将所有原来的ctor函数内的首尾插入__asan_before/after_dynamic_init
define internal void @_GLOBAL__sub_I_a.cpp() #0 section ".text.startup" {entry:call void @__asan_before_dynamic_init(i64 ptrtoint ([6 x i8]* @___asan_gen_.14 to i64))call void @__cxx_global_var_init()call void @__asan_after_dynamic_init()ret void
}

关于运行时具体注册全局变量,请看《ASAN Runtime源码分析(二)——注册全局变量》

ASAN Pass源码分析(六)——全局变量插桩相关推荐

  1. 【转】ABP源码分析六:依赖注入的实现

    ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...

  2. motan源码分析六:客户端与服务器的通信层分析

    本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...

  3. 谷歌chrome浏览器的源码分析(六)

    消息的流通过程,是一个不同类相互交流的过程,如果不了解这个过程,根本就不知道这些类是怎么样相互协作的.由于上一次说到ViewHostMsg_RequestResource消息已经发送出来,它的处理过徎 ...

  4. 传奇源码分析-客户端(全局变量与总体执行流程)

    客户端: 传奇的客户端源代码有两个工程,WindHorn和Mir2Ex. 先剖析一下WindHorn工程. 1. CWHApp.CWHWindow和CWHDXGraphicWindow.Window程 ...

  5. Heritrix源码分析(六) Heritrix的文件结构分析

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.javaeye.com/blog/642618        欢迎加入Heritrix群(QQ): 109148319 ...

  6. 集合框架源码分析六之堆结构的实现(PriorityQueue)

    /** * * 优先队列是用了一种叫做堆的高效的数据结构, * 堆是用二叉树来描述的,对任意元素n,索引从0开始,如果有子节点的话,则左子树为 * 2*n+1,右子树为2*(n+1). * 以堆实现的 ...

  7. Tomcat源码分析(六)--日志记录器和国际化

    本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 日志记录器挺简单的,没有很多东西,最主要的就是一个Logger接口: ...

  8. tcp/ip 协议栈Linux内核源码分析六 路由子系统分析一路由缓存

    内核版本:3.4.39 收到报文或者发送报文的时候都需要查找路由表,频繁的路由表查找操作时需要耗费一部分CPU的,Linux提供了路由缓存来减少路由表的查询,路由缓存由hash表组织而成,路由缓存的初 ...

  9. rnnlm源码分析 六

    系列前言 参考文献: RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读) Recurrent neural networ ...

  10. rnnlm源码分析(六)

    系列前言 参考文献: RNNLM - Recurrent Neural Network  Language Modeling Toolkit(点此阅读) Recurrent neural networ ...

最新文章

  1. RabbitMQ配置Mqtt协议
  2. js实现返回顶部功能的解决方案
  3. get请求可以传数组吗_王源 袁冰妍 孟美岐 手套在大片中的时尚,普通人可以get吗...
  4. 商汤科技2020数据分析师0820笔试题目整理
  5. 从流程的自动化中获得最大价值的10种方式
  6. Oracle创建表空间、用户、分配权限、导出、导入数据
  7. 深入理解CPU cache:组织、一致性(同步)、编程
  8. 你的第一杯Web 2.0 —— 快速浏览jQuery、Spring MVC和XStream/Jettison
  9. memcmp与strcmp区别
  10. 2012.4.16总结(四)
  11. TiledMap 使用
  12. X86服务器虚拟化技术CNware-WinServer
  13. 删除pdf(论文)的行号
  14. java错误代码1061_求助java大神,看下这是哪里出错了
  15. cmos电路多余输入端能否悬空_CMOS电路不使用的输入端不能悬空,会造成逻辑混乱。 这是为什么?...
  16. 2022年宜昌市高新技术企业申报奖励政策以及认定条件要求汇总!
  17. centos7 搭建 svn 服务端
  18. Pytorch学习笔记——fan_in和fan_out
  19. moto a1200 handset volumn
  20. 转帖 CSDN网友挑选的2007年最有价值文章-2010南非世界杯Vuvuzela

热门文章

  1. Unity笔记-29-ARPG游戏项目-10-完善攀爬
  2. 药店不停业盘点操作流程,海典盘点机PDA操作使用说明
  3. 假AI?如何辨识 AI 界的snake oil
  4. nginx.conf配置外部 .conf文件
  5. 验证苹果商店服务器通知 responseBodyV2
  6. android qq音乐 搜索,QQ音乐搜索功能基本思路
  7. 电商直播带货模式的发展现状
  8. 比较好的PHP开源项目
  9. java小练习:乘法表的实现(不止是9)
  10. Volatility3内存取证工具使用详解