C6029
警告 C6029:对 <function> 的调用中可能会发生缓冲区溢出: 使用未经检查的值
此警告意味着为使用缓冲区和大小的函数传递了未经检查的大小。 尚未对从某个外部源读入的数据进行验证,以查看它是否小于缓冲区大小。 攻击者可能会有意为大小指定一个比预期值大得多的值,这将导致缓冲区溢出。
通常,无论何时从不受信任的外部源读取数据,都要确保验证它的有效性。 通常,较为恰当的做法是,验证大小以确保它在预期范围内。
示例
下面的代码通过两次调用带批注的函数 ReadFile 来生成此警告。 在首次调用之后,Post 特性将第二个参数值标记为不受信任。 因此,如果在第二次调用 ReadFile 时传递不受信任的值,则会生成此警告,如下面的代码所示:
#include "windows.h"
bool f(HANDLE hFile)
{
char buff[MAX_PATH];
DWORD cbLen;
DWORD cbRead;
// Read the number of byte to read (cbLen).
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
return false;
}
// Read the bytes
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
return false;
}
return true;
}
若要更正此警告,请如下面的代码所示检查缓冲区大小:
bool f(HANDLE hFile)
{
char buff[MAX_PATH];
DWORD cbLen;
DWORD cbRead;
// Read the number of byte to read (cbLen).
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
return false;
}
// Ensure that there's enough space in the buffer to read that many bytes.
if (cbLen > sizeof(buff))
{
return false;
}
// Read the bytes
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
return false;
}
return true;
}