Почему gflags «Включить проверку хвоста кучи» не работает отдельно на Windows? - PullRequest
1 голос
/ 06 августа 2020

Для 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 .., что правильно.

enter image description here

This is after the loop was executed. The 12 bytes pattern was overrun. enter image description here

This is after the memory block was released. enter image description here

There was no exception, no debugger kick-in. And the message after delete was also printed successfully. введите описание изображения здесь

Примечание: Если я включил PageHeap одновременно , та же проблема переполнения хвостового буфера (я уверен, что она не вышла за пределы следующая страница, защищенная PageHeap, конечно) была затем захвачена.

Это ошибка в диспетчере кучи? Я думаю, что «Включить проверку хвоста кучи» и PageHeap - две независимые функции.

...