我正在VS 2015上构建64位C ++代码。
train()
当我从HP-fortify运行代码时,我看不到任何构建警告或任何强化问题。
但是,当我单独构建代码时,我在第二行看到警告 -
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
}
现在,当我更改代码时 -
warning C4267: '=': conversion from 'size_t' to 'DWORD', possible loss of data
构建警告消失了。但是,当我针对 HP-Fortify 运行此新代码时,我现在在sprintf_s行看到以下错误 -
缓冲区溢出 (输入验证和表示,数据流) - 该函数在分配的内存范围之外写入,这可能会破坏数据,导致程序崩溃或导致恶意代码的执行。
答案 0 :(得分:1)
In 64-bit mode a size_t will be 64-bits, but a DWORD will always be 32-bit... So assigning a 64-bits value to 32 bits value looses the top 32-bits of the size_t, hence the warning.
Why you only get it in release mode - no idea.
答案 1 :(得分:0)
blockLength = static_cast<int>(strlen((LPCSTR)sourceVar));
使用static_cast修复了该问题。 HP Fortify中没有错误,构建时没有警告。