C6204

更新:2007 年 11 月

警告 C6204:对 <function> 的调用中可能发生了缓冲区溢出: 使用了未经检查的参数 <variable>

此警告指出对某函数的调用可能会导致堆栈缓冲区溢出,具体情况取决于被分析函数的参数的可能值。此缺陷可能会导致可利用的缓冲区溢出或系统故障。

最好检查一下代码以及该函数的调用方,查看是否曾经利用意外的数据调用过该函数。如果不能确定所有的调用都是安全的,则一种比较恰当的方法是,通过检查所有输入字符串的长度或使用适当的属性对函数参数进行批注,来验证函数的输入。

示例

在下面的代码中,由于输入参数 (pCh) 可能包含无效数据,因此会生成此警告:

#include<string.h>

void f(char *pCh)
{
  char buff[10];
  strcpy(buff, pCh);
}

可以通过验证大小来更正此警告,如下面的代码所示:

#include<string.h>

void f(char *pCh)
{ 
  char buff[10];
  if (strlen(pCh) >= sizeof buff)
    return;
  strcpy (buff, pCh);
}

如果传递错误的指针 (pCh),则上面的代码可能失败。若要使上面的代码更可靠,应使用批注和安全的字符串操作函数,如下面的代码所示:

#include<string.h>
#include <codeanalysis\sourceannotations.h>
void f([Pre(NullTerminated=SA_Yes, Null=SA_No)] char* pCh)
{
  char buff[15];
  if (strlen(pCh) > sizeof buff)
    return;
  strcpy_s(buff,sizeof(buff), pCh);
}

由于分析工具没有考虑到被分析函数的所有可能的调用方,因此该代码可能是绝对安全的。

请参见

概念

批注概述

参考

strcpy_s, wcscpy_s, _mbscpy_s