Каждый 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()
вызова (я не уверен, почему они не включены в ваше сообщение).