AddressSanitizer,这些术语是什么意思?

15

所以我正在使用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],这可能表示问题?)

Heap left redzone指的是在使用堆内存时,程序访问了未分配的区域。而[fa]通常表示堆栈错误。

请注意,这些术语与特定编程语言和开发环境有关。


修复了我的错误。这是一次越界访问。(似乎很合理,但我仍然想知道它是如何工作的,尤其是因为这将是第一次在任何地方解释这个术语)。 - Tarick Welling
1
虽然这是一个关于C++的问题,但你可能会在这里找到一些答案:https://dev59.com/7rfna4cB1Zd3GeqPlQcx#58488873 - RobertS supports Monica Cellio
1个回答

25

Heap left redzone指的是什么?

当AddressSanitizer堆拦截器响应类似下面的操作分配堆内存时:

char *p = malloc(5);

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

最后,它将返回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

这实际上比你想象的更常见,并且似乎已经发生在你身上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接