Понимание резюме ASAN - PullRequest
       46

Понимание резюме ASAN

0 голосов
/ 09 января 2020

Пример ниже взят из отчета ASAN, вызванного heap-use-after-free on address 0x6040000a06b0 Как бы я мог сказать, что это было использование кучи после бесплатной ошибки исключительно из просмотра этой сводки?

SUMMARY: AddressSanitizer: heap-use-after-free /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:826 in __interceptor_memcmp
Shadow bytes around the buggy address:
  0x0c088000c080: fa fa fa fa fd fd fd fa fa fa fa fa fd fd fd fa
  0x0c088000c090: fa fa fa fa fd fd fd fa fa fa fa fa fd fd fd fa
  0x0c088000c0a0: fa fa fa fa fd fd fd fa fa fa fa fa fd fd fd fa
  0x0c088000c0b0: fa fa fa fa fd fd fd fd fa fa fa fa 00 00 00 fa
  0x0c088000c0c0: fa fa fa fa 00 00 00 fa fa fa fa fa 00 00 00 fa
=>0x0c088000c0d0: fa fa fa fa fd fd[fd]fa fa fa fa fa 00 00 00 fa
  0x0c088000c0e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c088000c0f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c088000c100: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c088000c110: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c088000c120: 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
  Shadow gap:              cc

В более широком смысле мне интересно, какую информацию я должен извлечь и как мне интерпретировать, в чем конкретно заключается ошибка, из приведенного выше резюме. Сможет ли кто-нибудь превентивно увидеть дополнительные ошибки ASAN, если они появятся в этом резюме?

1 Ответ

0 голосов
/ 10 января 2020

Каждый 8-байтовый фрагмент пользовательской памяти сопоставляется с одним байтом теневой памяти Асана. Если этот 8-байтовый блок содержит действительные данные, теневой байт будет иметь 0, 1, ... или 7. Любое другое значение сообщает среде выполнения Asan, что память недопустима, т. Е. Она была освобождена или кадр стека был освобожден или что-то в этом роде. В частности, fd означает, что этот адрес 0x6040000a06b0 указывает на освобожденный буфер кучи (то же самое верно и для предыдущих 8 байтов, кстати - он также помечен fd).

Подробности о конкретных значениях объясняются в конец сообщения об ошибке:

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
  Shadow gap:              cc

На ваш другой вопрос основное сообщение об ошибке:

SUMMARY: AddressSanitizer: heap-use-after-free /build/gcc/src/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:826 in __interceptor_memcmp

Сообщает тип ошибки и ее местоположение в коде.

Обычно он также сообщит полную трассировку стека для free() вызова и историческую трассировку стека для исходного malloc() вызова (я не уверен, почему они не включены в ваше сообщение).

...