Как следует прочитать сообщение об ошибке переполнения буфера? - PullRequest
0 голосов
/ 21 октября 2019

Я хотел знать, как следует читать следующее сообщение об ошибке. В частности:

(1) что означают такие вещи, как fa (heap left redzone) и fd (область освобожденной кучи)?

(2) Какое значение имеют значения 00 и 05.

(3) Какое значение имеет блок памяти, на который указывает (0x0c067fff8010)?

(4) Что такое дикий указатель?

(5) Почему фа в строке с блоком памяти, который имеет стрелку в квадратных скобках ([fa])?

Команда компиляции

clang++ test.cpp -fsanitize=address -D_LIBCPP_DEBUG=1

Сообщение об ошибке

Address 0x6030000000f0 is a wild pointer.
SUMMARY: AddressSanitizer: heap-buffer-overflow 
(/home/tzadiko/randomStuff/a.out+0x4fa83d) in main
Shadow bytes around the buggy address:
  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 fd fd fd fd fa fa 00 00 00 07 fa fa 00 00
=>0x0c067fff8010: 05 fa fa fa 00 00 04 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
  0x0c067fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

1 Ответ

1 голос
/ 21 октября 2019

Вы пропустили важный бит вывода. Вот легенда (взято из документации ):

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
  Heap righ redzone:     fb
  Freed Heap region:     fd
  Stack left redzone:    f1
  Stack mid redzone:     f2
  Stack right redzone:   f3
  Stack partial redzone: f4
  Stack after return:    f5
  Stack use after scope: f8
  Global redzone:        f9
  Global init order:     f6
  Poisoned by user:      f7
  ASan internal:         fe

После прочтения этого описания я думаю, что адрес ваших вопросов, в свою очередь:

  1. Красная зона - это область недоступных данных как слева, так и справа от распределения. ASan сохраняет битовую маску всей памяти и определяет для каждой 8-байтовой области, какой это тип памяти.

  2. Как видно из легенды, 00 - это полностью адресуемая память, с 01 по 07 означает"частично адресуемый". Значение с 05 в нем, вероятно, означает, что первые 5 байтов этого 8-байтового блока могут быть адресованы.

  3. 0x0c067fff801e - это индекс в битовой карте. Часть в скобках указывает, какой теневой байт предназначен. Умножьте его на 8, и вы получите 0x6033fffc00f0, который, по-видимому, все еще должен быть немного изменен, чтобы вернуться в нарушающую область памяти

  4. Дикий указатель - это указатель на нераспределенный (илинедавно освобожден) память.

  5. См. 3.

...