【问题标题】:AccessSize importance in ASAN instrumented codeAccessSize 在 ASAN 检测代码中的重要性
【发布时间】:2020-04-25 01:26:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: memory memory-management address-sanitizer


    【解决方案1】:

    正如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),则访问不正确,应报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 2021-09-22
      • 1970-01-01
      • 2018-05-11
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      相关资源
      最近更新 更多