none
Ошибка в работе с памятью через Win API под Win7x64 RRS feed

  • Вопрос

  • При портировании приложений под 64-разрядную платформу возникла идея принудительного выделения памяти в диапазоне адресов выше 4Гб, чтобы быстрее отловить ошибки преобразования указателей через DWORD и т.п.

    Попробовал выполнить следующий код:

    HANDLE hHeap = HeapCreate(0,0,0x100000000); // неограниченная куча, принудительно выше 4Gb
    void* p = HeapAlloc(hHeap, 0, 100); // срабатывает корректно
    HeapFree(hHeap, 0, p); // "выстреливает" ошибка: неверный адрес

    Куча памяти создаётся, базовый адрес, как и ожидалось, находится выше 4Гб. Блок памяти в 100 байт выделяется, но при попытке его освободить вылетает ошибка отладки, вроде как указываемый адрес неверен. Если создать кучу ниже 4Gb, то всё работает нормально.

    Операционная система: Windows 7 x64

    1 марта 2012 г. 3:29

Ответы

  • У меня также Win7 SP1 x64

    Вы пример собирали под x64? Под х32 он у меня тоже работает, поскольку предпочтительный адрес кучи в этом случае будет 0.

    Я "походил" отладчиком внутри функции  HeapFree, ошибка вылетает при отладочной проверке хэндла кучи (внутри NTDLL!RtlAllocateHeap). Если запустить пример ниже без отладчика, то выводится сообщение "1" , если под отладчиком, то вылетает ошибка и затем сообщение "0".

    HANDLE hHeap = HeapCreate(0,0,0x100000000);
    void* p = HeapAlloc(hHeap, 0, 100);
    BOOL bb = HeapFree(hHeap, 0, p);
    MessageBoxA(NULL, bb ? "1" : "0", "Title", 0);


    • Изменено AGL.12 5 марта 2012 г. 7:18
    • Помечено в качестве ответа Abolmasov Dmitry 7 марта 2012 г. 10:49
    5 марта 2012 г. 7:17

Все ответы

  • Возможно глупый вопрос задам, но я тут новичок..

    Куда писать-то надо, чтобы ошибку это исправили в API ?

    Тут представители разработчиков API от Microsoft есть? Или на англоязычный ресурс надо писать?

    5 марта 2012 г. 2:41
  • Здравствуйте.

    Лучше писать на англоязычный или Microsoft Connect. Вы точно уверены, что это именно баг в WinAPI?


    Для связи [mail]

    5 марта 2012 г. 7:01
  • У меня Win7 x64 SP1, установлены все апдейты и Visual Studio 2010 SP1 с также установленными апдейдами - ваш код работает без ошибок.


    Для связи [mail]

    5 марта 2012 г. 7:10
  • У меня также Win7 SP1 x64

    Вы пример собирали под x64? Под х32 он у меня тоже работает, поскольку предпочтительный адрес кучи в этом случае будет 0.

    Я "походил" отладчиком внутри функции  HeapFree, ошибка вылетает при отладочной проверке хэндла кучи (внутри NTDLL!RtlAllocateHeap). Если запустить пример ниже без отладчика, то выводится сообщение "1" , если под отладчиком, то вылетает ошибка и затем сообщение "0".

    HANDLE hHeap = HeapCreate(0,0,0x100000000);
    void* p = HeapAlloc(hHeap, 0, 100);
    BOOL bb = HeapFree(hHeap, 0, p);
    MessageBoxA(NULL, bb ? "1" : "0", "Title", 0);


    • Изменено AGL.12 5 марта 2012 г. 7:18
    • Помечено в качестве ответа Abolmasov Dmitry 7 марта 2012 г. 10:49
    5 марта 2012 г. 7:17
  • Да, действительно ошибка отладчика. Напишите на анлг форум, там быстрее должны оформить это как баг, и на connect если возможно. А сюда выложите ссылки, будет следить, если возникнут какие-либо вопросы - попытаюсь помочь.

    Спасибо.


    Для связи [mail]

    5 марта 2012 г. 8:03