首页 > 解决方案 > AccessSize 在 ASAN 检测代码中的重要性

问题描述

我最近一直在处理Address Sanitizer(ASAN)的内部,我开始了解 ASAN 的代码检测。

当检测 1,2,4 字节访问时,检测是:

ShadowAddr = (Addr >> 3) + Offset;
k = *ShadowAddr;
if (k != 0 && ((Addr & 7) + AccessSize > k))
    ReportAndCrash(Addr);

我不明白 AccessSize 的line 3作用以及为什么在那里使用它。

标签: memorymemory-managementaddress-sanitizer

解决方案


正如AddressSanitizerAlgorithm wiki中所解释的,影子内存的每个字节都对相应的 7 个用户内存字节的状态进行编码:

  • 0 表示所有 8 个字节都有效
  • k=1..7 表示 k 字节有效
  • (其他值也有含义,但为简洁起见我们省略了它们)

因此条件

if (k != 0 && ((Addr & 7) + AccessSize > k))
    ReportAndCrash(Addr);

意味着如果少于 8 个字节是有效的 ( k != 0) 并且访问的内存范围不适合有效字节 ( (Addr & 7) + AccessSize > k) 访问是不正确的,应该报告。


推荐阅读