【问题标题】:AddressSanitizer, What do these terms mean?AddressSanitizer,这些术语是什么意思?
【发布时间】:2020-03-01 15:23:24
【问题描述】:

所以我正在使用 AddressSanitizer。但它在描述问题时使用了一些密集的术语。

Shadow bytes around the buggy address:
  0x0c067fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c067fff8000: fa fa 00 00 00 00[fa]fa 00 00 00 fa fa fa 00 00
  0x0c067fff8010: 00 fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==7320==ABORTING

Heap left redzone 是什么意思? (还有其他人,但我对fa 最感兴趣,因为有一个[fa] 可能表明问题?)

【问题讨论】:

  • 修复了我的错误。这是一个越界访问。 (似乎合乎逻辑,但我仍然想知道它是如何工作的,因为这将是第一次解释这个术语)
  • 虽然是根据一个 C++ 问题,但你可以在这里找到一些答案:stackoverflow.com/a/58488873/12139179

标签: c gcc clang address-sanitizer sanitizer


【解决方案1】:

Heap left redzone 是什么意思?

当 AddressSanitizer 堆插入器分配堆内存以响应以下内容时:

char *p = malloc(5);

它分配的内存比你要求的多。假设它在地址q 分配了32 个字节。然后它将前 16 个字节(区域 [q, q+15])标记为不可访问的堆左红色区域(fa),接下来的 5 个字节为可寻址(0),接下来的 11 个字节为堆右红色区域(@ 987654326@).

最后它将q+16返回给应用程序(分配给p)。

现在,如果应用程序尝试从p-1p-2、...p-15 读取或写入,所有此类尝试都将被检测到,因为它们都将落在左侧红色区域。这是堆下溢。

同样,访问p+5p+6、...p+10(堆溢出)的尝试也会被检测到,因为它们都会落在右侧的红色区域。

为什么应用程序会出现堆下溢?考虑这段代码:

int idx = get_valid_index(...);  // return -1 on failure
...
if (p[idx] == ...) {   // BUG: forgot to check idx!=-1

这实际上发生的频率比你想象的要多,而且似乎已经发生在你身上。

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2013-05-09
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多