从 'BYTE *' 到 'ULONG' 的指针截断
Pointer truncation from 'BYTE *' to 'ULONG'
我试图为 windows 编写一个简单的过滤器驱动程序,当我想要构建项目时,Visual Studio 给了我以下警告:
警告 C4311 'type cast':从 'BYTE *' 到 'ULONG'
的指针截断
和错误:
C2220 警告被视为错误 - 未生成 'object' 文件
这是我的代码:
BOOLEAN GetAllBufferFromChunkedFormat(STREAM_EDIT_PARAMETERS* params, BYTE**
dataBuffer)
{
if (!CheckPointer(params) || !CheckPointer(dataBuffer))
{
return FALSE;
}
BYTE* iterator = params->dataStart + params->contentStart;
params->currentContentLength = 0;
UINT currentChunkLength = 0;
BOOLEAN isAllData = FALSE;
while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength) //calculate total length
{
currentChunkLength = strtol(iterator, &iterator, 16);
iterator += s_chunksSeparatorLength + currentChunkLength + s_chunksSeparatorLength;
..
..
..
}
警告显示在行:
while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength)
问题是什么?为什么?
一个LONG类型是4字节宽,而指针类型如BYTE*有架构的宽度,即在 x86 平台上为 32 位或 4 字节,在 x64 架构上为 64 位(8 字节)。因此这在 x86 平台上编译良好,但在 64 位平台上给出警告(被视为错误)。
对于 x64 体系结构,正确的转换应该是数字类型“LONG LONG”或 UINT64 和类似类型,或者如果你真的不在乎你可以static_cast(x)这个值。
我试图为 windows 编写一个简单的过滤器驱动程序,当我想要构建项目时,Visual Studio 给了我以下警告:
警告 C4311 'type cast':从 'BYTE *' 到 'ULONG'
的指针截断和错误: C2220 警告被视为错误 - 未生成 'object' 文件
这是我的代码:
BOOLEAN GetAllBufferFromChunkedFormat(STREAM_EDIT_PARAMETERS* params, BYTE**
dataBuffer)
{
if (!CheckPointer(params) || !CheckPointer(dataBuffer))
{
return FALSE;
}
BYTE* iterator = params->dataStart + params->contentStart;
params->currentContentLength = 0;
UINT currentChunkLength = 0;
BOOLEAN isAllData = FALSE;
while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength) //calculate total length
{
currentChunkLength = strtol(iterator, &iterator, 16);
iterator += s_chunksSeparatorLength + currentChunkLength + s_chunksSeparatorLength;
..
..
..
}
警告显示在行:
while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength)
问题是什么?为什么?
一个LONG类型是4字节宽,而指针类型如BYTE*有架构的宽度,即在 x86 平台上为 32 位或 4 字节,在 x64 架构上为 64 位(8 字节)。因此这在 x86 平台上编译良好,但在 64 位平台上给出警告(被视为错误)。
对于 x64 体系结构,正确的转换应该是数字类型“LONG LONG”或 UINT64 和类似类型,或者如果你真的不在乎你可以static_cast(x)这个值。