Предупреждение - преобразование из 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 нет ошибок и предупреждений при сборке.