文章目录
1 ASAN
1.1 介绍
-fsanitize=address是一个编译器选项,用于启用AddressSanitizer(地址清理器,简称ASAN),这是一种快速的内存错误检测工具。它可以检测出程序中内存相关的常见错误:
- 越界访问(out-of-bounds accesses)
- 使用后释放(use-after-free)
- 作用域外使用(use-after-scope)
1.2 原理
ASAN会记录每一块内存的可用性。把用户程序所在的内存区域叫做主内存, 而记录主内存可用性的内存区域,则叫做影子内存 (Shadow memory)。
-
分配过的地址空间,即使 free 过了,也不会再次分配给用户。用户感受到的就是内存分配器每次分配出来的内存地址总是自增,运行内存变大。
-
已经 free 过的内存区域这里称为 Dead Zone
-
每次分配一段内存时,总会在两端预留一个页面,并且将这两个页面做读写保护。两端预留的页面称为 Red Zone