Предупреждение - преобразование из 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 -

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

2 ответа

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

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

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

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

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