簡體   English   中英

AddressSanitizer,這些術語是什么意思?

[英]AddressSanitizer, What do these terms mean?

所以我正在使用 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 是什么意思?

當 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

這實際上發生的頻率比你想象的要高,而且似乎已經發生在你身上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM