Проблема приведения типа программирования в 64-битных Windows API - PullRequest
0 голосов
/ 12 октября 2019

(извините за мой плохой английский). У меня есть 2 вопроса о 64-битном программировании.

Мой код работал хорошо, но сегодня я получаю сообщение об ошибке (без компиляции или анализа кода). И это случайно. Например, иногда код работает, иногда нет. Когда я открываю исполняемый файл внутри WinDbg, мой код всегда получает ошибку. Я думаю, что это проблема с приведением 64-битного типа.

Пример кода:

DWORD hash_string_len = 0;
hash_string_len = (DWORD)strlen(hash_string); //hash_string is 32 character hash (A998B0FE08AB295072965B5A4B0C835E)
if (hash_string_len != (DWORD)(MD5_DIGEST_LENGTH * 2)) //MD5_DIGEST_LENGTH (#define MD5_DIGEST_LENGTH 16)
{
   debug_this(); //printf("%d\n",__LINE__)
   HeapFree(GetProcessHeap(), 0, ENGINE_HASHLIST_MD5_ENTRY);
   return FALSE;
}

Без кода WinDbg не печатайте ошибку (методом debug_this ()), но внутри кода WinDbg выведите номер строки (причина:hash_string_len! = 32) но я знаю hash_string_len = 32, поэтому я думаю, что это проблема 64-битного усечения. Кто-нибудь может мне помочь?

Мой второй вопрос:

Может ли это привести к ошибке в 64-битном программировании?

DWORD a = 0;

some_func(&a);


some_func(PDWORD pA)
{
 *pA = 1;
}

Поскольку я использую много кодов, подобных этому, внутри моегопроект. Вот так.

LZMA Lib

SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);

Я называю эту функцию вот так.

DWORD destLen = 0;
PBYTE dest = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)1024);
LzmaDec_DecodeToBuf(...,dest,&destLen,...)

Так что у меня действительно есть проблема с функциями в 64-битном программировании. Спасибо за чтение

1 Ответ

0 голосов
/ 12 октября 2019

Предполагая, что SizeT равно SIZE_T:

Я называю эту функцию такой.

DWORD destLen = 0;
PBYTE dest = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(SIZE_T)1024);
LzmaDec_DecodeToBuf(...,dest,&destLen,...)

Передача адреса DWORD (32-битная ширина на 32-bit-windows, а также в 64-битных окнах) туда, где ожидается адрес SIZE_T (64-битная в 64-битных окнах и 32-битная в 32-битных), это плохо.

Приведите DWORD к SIZE_T , прежде чем получить его адрес , например:

LzmaDec_DecodeToBuf(..., dest, &((SIZE_T) destLen), ...)

Введите временную переменную SIZE_T и введитеего адрес:

{
  SIZE_T s = destLen; /* The initialisation is only necessary if
                         LzmaDec_DecodeToBuf() expects a value. */
  LzmaDec_DecodeToBuf(..., dest, &s, ...);
  if (((SIZE_T) UINT_MAX) < s) {
    /* handle overflow of destLen! */
  }
  destLen = s;
}

Подробнее о миграции кода с 32-битного на 64-битный с помощью VC в Windows можно узнать здесь: https://docs.microsoft.com/en-us/cpp/build/common-visual-cpp-64-bit-migration-issues?view=vs-2019

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...