Registry — стек поврежден только для отладочной конфигурации. Переполнение стека

Я пытаюсь получить версию какой-то программы через реестр. Мой код работает нормально, когда установлен в конфигурации выпуска. Когда я пытаюсь запустить его в режиме отладки, мой код вылетает при выходе из этой функции с сообщением «Ошибка проверки времени выполнения № 2 — стек вокруг переменной« версия »был поврежден».

Я буду вставлять только соответствующий код моей функции. Это все «версии» появления в моем коде. Когда я отлаживаю его, версия получает правильное значение. Код не падает в конфигурации выпуска. Для обеих конфигураций я установил «Использовать многобайтовый набор символов».

TCHAR version[20];
DWORD dwBufferSize = 0;
if (RegQueryValueEx(hAppKey, "DisplayVersion", NULL,&dwType, (unsigned char*)version, &dwBufferSize) == ERROR_SUCCESS)
{
dwBufferSize = 20;
std::string vers(version, dwBufferSize);
return vers;
}

Есть идеи как это решить?

0

Решение

Ваш код делает не отлично работает в релизе. Он содержит переполнение буфера, на которое накапливается отладочная сборка, которая содержит дополнительную проверку ошибок.

Беглый взгляд в документации для RegQueryValueEx показывает, что вы делаете неправильно:

LONG WINAPI RegQueryValueEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpValueName,
_Reserved_ LPDWORD lpReserved,
_Out_opt_ LPDWORD lpType,
_Out_opt_ LPBYTE lpData,
_Inout_opt_ LPDWORD lpcbData
);

lpcbData [in, out, необязательно] Указатель на переменную, которая указывает размер буфера, на который указывает параметр lpData, в байтах. Когда функция возвращается, эта переменная содержит размер данных, скопированных в lpData.

Вы говорите функции, что ваш буфер имеет размер 0, когда он на самом деле равен 20 * sizeof (TCHAR) байтов, а не 0 и не 20.

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

1

Другие решения

Похоже, вы говорите, что размер вашего буфера равен нулю. Почему ты не говоришь 20?

0

Похоже, что это неправильно, так как ваш буфер равен 0. Но это 20 TCHAR:

DWORD dwBufferSize = 0;

Вероятно, должно быть:

DWORD dwBufferSize = sizeof(version);

Это важно, потому что это используется для передачи в RegQueryValueEx как размер version буфер. RegQueryValueEx просто так происходит обновление этого значения, когда оно возвращается с количеством фактически использованных байтов.

0
По вопросам рекламы [email protected]