C6029

更新:2007 年 11 月

警告 C6029:对 <function> 的调用中可能会发生缓冲区溢出: 使用未经检查的值

此警告意味着为使用缓冲区和大小的函数传递了未经检查的大小。尚未对从某个外部源读入的数据进行验证,以查看它是否小于缓冲区大小。攻击者可能会有意为大小指定一个比预期值大得多的值,这将导致缓冲区溢出。

通常,无论何时从不受信任的外部源读取数据,都要确保验证它的有效性。通常,较为恰当的做法是,验证大小以确保它在预期范围内。

示例

下面的代码通过两次调用带批注的函数 ReadFile 来生成此警告。在首次调用之后,Post 属性将第二个参数值标记为不受信任。因此,如果在第二次调用 ReadFile 时传递不受信任的值,则会生成此警告,如下面的代码所示:

#include "windows.h"
void f(char *buff, DWORD cbLen, DWORD cbRead, HANDLE hFile)
{
  if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))  
  {
    // code ...
    if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL))  // warning 6029
    {
      // code ...
    }
  }
}

若要更正此警告,请如下面的代码所示检查缓冲区大小:

void f(char *buff, DWORD cbLen, DWORD cbRead, HANDLE hFile)
{
  if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))  
  {
    // code ...
    if (cbLen <= sizeof (buff))  // check length
    {
    // code ...  
      if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL))  
      {
       // code ...
      }
    }
  }
}

请参见

概念

批注概述