Почему Application Verifier не может обнаружить утечки памяти?

Я использую Windows 10 Application Verifier, x64 версии 10.0.10586. В нем установлены все флажки "Основы", в том числе "Утечка". Любопытно, что Application Verifier реализует кучу защищенной страницы для памяти, так как вызов malloc возвращает память в конце страницы.

Код DLL:

extern "C" __declspec(dllexport) void LeakMemory()
{
    malloc(1);
    VirtualAlloc(nullptr, 4096, MEM_COMMIT, PAGE_READWRITE);
}

основной код:

#include <Windows.h>
#include <crtdbg.h>

int main(int, char**)
{
    //_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    HMODULE h = LoadLibraryW(L"DLLProject.dll");
    void(*pLeakMemory)() = reinterpret_cast<void(*)()>(GetProcAddress(h, "LeakMemory"));
    pLeakMemory();
    FreeLibrary(h);

    printf("bye\n");
    return 0;
}

Вывод следующий:

Page heap: pid 0xFE8: page heap enabled with flags 0x3.
AVRF: ConsoleApplication4.exe: pid 0xFE8: flags 0x81643027: application verifier enabled
bye
The program '[11172] TestProject.exe' has exited with code 0 (0x0).

Верификатор приложения не может сообщить об утечке.

Если я включаю вызов _CrtDbgFlag, то проверяет, что на самом деле утечка malloc, также печатая это при завершении работы приложения:

Detected memory leaks!
Dumping objects ->
{74} normal block at 0x0000015C0979EFF0, 1 bytes long.
 Data: < > CD 
Object dump complete.

Почему не работает Application Verifier? Также не удается найти утечки, если я выделяю память в main() вместо DLL, но я думаю, что это известное ограничение.

0 ответов

Другие вопросы по тегам