Я строю 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 —
Переполнение буфера
(Проверка и представление входных данных, Поток данных) —
Функция записывает данные за пределы выделенной памяти, что может повредить данные, вызвать сбой программы или привести к выполнению вредоносного кода.
В 64-битном режиме size_t будет 64-битным, но DWORD всегда будет 32-битным …
Таким образом, присвоение 64-битного значения 32-битному значению приводит к потере старших 32-битового значения size_t, отсюда и предупреждение.
Почему вы получаете его только в режиме релиза — понятия не имею.
blockLength = static_cast<int>(strlen((LPCSTR)sourceVar));
Использование static_cast устранило проблему. В HP Fortify нет ошибок и предупреждений при сборке.