Предупреждение — преобразование из size_t в DWORD, возможная потеря данных

Я строю 64-битный код C ++ на VS 2015.

DWORD blockLength;
blockLength = strlen((LPCSTR)sourceVar);    // sourceVar is of type Cstring, build warning here.

// Allocate memory.
defaultBuffer = new unsigned char[blockLength + 1];

sprintf_s(reinterpret_cast<char*>(defaultBuffer), (blockLength + 1), "%s", (LPCSTR)sourceVar);

// Decrypt data
if (!someMethod(someParameter, 0, 1, 0, defaultBuffer, &blockLength))
{
// Do something
}

Когда я запускаю код из HP-Fortify, я не вижу никаких предупреждений сборки или каких-либо проблем с укреплением.

Однако, когда я строю код отдельно, я вижу это предупреждение на 2-й строке —

warning C4267: '=': conversion from 'size_t' to 'DWORD', possible loss of data

Сейчас, когда я делаю эти изменения кода

blockLength = sourceVar.GetLength();

Предупреждение о сборке исчезло. Тем не менее, когда я запускаю этот новый код против HP-Fortify, Теперь я вижу следующую ошибку в строке sprintf_s —

Переполнение буфера
(Проверка и представление входных данных, Поток данных) —
Функция записывает данные за пределы выделенной памяти, что может повредить данные, вызвать сбой программы или привести к выполнению вредоносного кода.

0

Решение

В 64-битном режиме size_t будет 64-битным, но DWORD всегда будет 32-битным …
Таким образом, присвоение 64-битного значения 32-битному значению приводит к потере старших 32-битового значения size_t, отсюда и предупреждение.

Почему вы получаете его только в режиме релиза — понятия не имею.

1

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

blockLength = static_cast<int>(strlen((LPCSTR)sourceVar));

Использование static_cast устранило проблему. В HP Fortify нет ошибок и предупреждений при сборке.

0

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