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;
}

请参见

概念

批注概述