Важность AccessSize в инструментированном коде ASAN - PullRequest
0 голосов
/ 07 января 2020

Я недавно имел дело с внутренними компонентами Address Sanitizer (ASAN) , и я узнал об инструментарии кода от ASAN.

При использовании инструментов 1,2, Доступ к 4-байтным инструментам:

ShadowAddr = (Addr >> 3) + Offset;
k = *ShadowAddr;
if (k != 0 && ((Addr & 7) + AccessSize > k))
    ReportAndCrash(Addr);

Я не мог понять, что делает AccessSize в line 3 и почему он там используется.

1 Ответ

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

Как объяснено в AddressSanitizerAlgorithm wiki каждый байт теневой памяти кодирует состояние соответствующих 7 байтов пользовательской памяти:

  • 0 означает, что все 8 байтов действительны
  • k = 1..7 означает, что k байтов действительны
  • (другие значения также означают что-то, но мы опускаем их для краткости)

Таким образом, условие

if (k != 0 && ((Addr & 7) + AccessSize > k))
    ReportAndCrash(Addr);

означает, что если допустимо менее 8 байтов (k != 0) и диапазон доступной памяти не помещается в допустимые байты ((Addr & 7) + AccessSize > k), то доступ неверный и должен быть сообщен.

...