C6203

警告 C6203:缓冲区 <variable> 在对 <function> 的调用中溢出: 长度 <size> 超过了缓冲区的大小

此警告意味着,正将指向已知大小的非堆栈缓冲区的参数传递到某个函数,但是该函数向缓冲区中复制的字节数大于缓冲区的大小。 这种情况将导致缓冲区溢出。

此缺陷可能导致可利用的安全漏洞或程序崩溃。

示例

下面的代码生成警告 C6203 和 C6386。 这两个警告都意味着缓冲区溢出问题,因为向函数传递了不正确的参数 (sizeof intArray):

#include <memory.h>
void f( )
{
  static char charArray[5];
  static int intArray[5];

  memset ((void *)charArray, 0, sizeof intArray);
  // code ...
}

若要同时更正这两个警告,请使用 sizeof charArray 传递正确的大小,如下面的代码所示:

void f( )
{
  static char charArray[5];
   
  memset ((void *)charArray, 0, sizeof charArray);
  // code ...
}

在下面的代码中,通过使用 WritableElementsLength 属性来批注该函数的参数 char *pC。 pC 中可写元素的实际数目就是缓冲区 char *pCLen 中的元素的数目。 在这种情况下,会在调用站点生成警告 C6203,因为 pCLen 的元素数比可写参数 pC 多。

#include <malloc.h>
#include <codeanalysis\sourceannotations.h>
using namespace vc_attributes;

void f([Pre(WritableElementsLength="pCLen")] char *pC, char *pCLen);

void test_f( )
{
  char *pChar = ( char * ) malloc ( 10 );
  char buff[15];
  test_f ( pChar, buff ); // warning 6203
  // code ...
}

警告 C6202 是针对堆栈缓冲区发出的。

请参见

参考

C6202

C6386