Для gflags была настроена только включенная функция «Включить проверку хвоста кучи». PageHeap не был включен.
c:\Program Files (x86)\Windows Kits\10\Debuggers\x64>gflags /i test.exe
Current Registry Settings for test.exe executable are: 00000010
htc - Enable heap tail checking
В приведенной ниже программе целое число размером 4 байта было выделено из кучи, которая использовала выравнивание по 16 байтам. Таким образом, остальные 12 байтов заполнены байтами маркеров.
int main()
{
int *p = new int{};
for (size_t i = 0; i < 16; ++i)
{
((char*)p)[i] = '0';
cout << ((char*)p)[i] << endl;
}
delete p;
cout << "After delete\n";
return 0;
}
И для MSFT это довольно просто.
Этот флаг добавляет короткий шаблон в конец каждого распределение. Windows менеджер кучи обнаруживает шаблон, когда блок освобождается, и, если блок был изменен, менеджер кучи переходит в отладчик.
Однако этого не произошло. Переполнение буфера не было зафиксировано, и процесс завершился успешно.
Структура памяти перед l oop, начиная с адреса выделенного целого числа. Остальные 12 байтов были заполнены с указанием c байтовых шаблонов ab ab ..
, что правильно.
This is after the loop was executed. The 12 bytes pattern was overrun.
This is after the memory block was released.
There was no exception, no debugger kick-in. And the message after delete
was also printed successfully.
введите описание изображения здесь
Примечание: Если я включил PageHeap одновременно , та же проблема переполнения хвостового буфера (я уверен, что она не вышла за пределы следующая страница, защищенная PageHeap, конечно) была затем захвачена.
Это ошибка в диспетчере кучи? Я думаю, что «Включить проверку хвоста кучи» и PageHeap - две независимые функции.