1. Valgrind memcheck 检测 UAF 与越界的影子内存设计?
Valgrind memcheck 如何通过影子内存设计检测 use-after-free(UAF)与越界访问?
- 影子内存(shadow memory)的概念
- 已定义/未定义位与地址位
- UAF 与越界的检测原理
Valgrind memcheck 把所有内存都映射到一份"影子内存"(shadow memory),记录每个字节的"已定义/未定义"(V 位)和"已分配/未分配"(A 位)状态。程序每次读写都会同步更新和检查影子内存:读未初始化(未定义)内存会报错;访问已释放(UAF)或未分配区域(越界)会因 A 位不匹配而报错。memcheck 通过二进制插桩把所有内存访问替换为检查影子内存的指令,以此在运行时精确捕获 UAF 和越界,代价是数倍到数十倍的性能下降。
影子内存是"以空间换追踪"的经典设计:用一份元数据反映所有内存状态,插桩代码在每次访问时校验,从而精确定位非法访问。这是 memcheck 强大但慢(比 ASan 慢约 10-50 倍)的原因。