Что означает левая красная зона Heap?
Когда промежуточный распределитель кучи AddressSanitizer выделяет память кучи в ответ на что-то вроде:
char *p = malloc(5);
он выделяет больше памяти, чем вы попросил о. Допустим, он выделяет 32 байта по адресу q
. Затем он пометит первые 16 байтов (регион [q, q+15]
) как недоступную кучу в левой красной зоне (fa
), следующие 5 байтов как адресуемую (0
), а следующие 11 байтов как кучу правой красной зоны (fb
).
Наконец, он вернет q+16
приложению (назначенному p
).
Теперь, если приложение пытается прочитать или записать из p-1
, p-2
, ... p-15
, все такие попытки будут обнаружены, потому что все они окажутся в левой красной зоне. Это переполнение кучи.
Аналогично, попытки доступа к p+5
, p+6
, ... p+10
(переполнение кучи) будут обнаружены, поскольку все они окажутся в правой красной зоне.
Зачем приложению когда-либо иметь переполнение кучи? Рассмотрим следующий код:
int idx = get_valid_index(...); // return -1 on failure
...
if (p[idx] == ...) { // BUG: forgot to check idx!=-1
На самом деле это происходит чаще, чем вы думаете, и кажется, что это случилось с вами.