C6059

警告 C6059:<function> 调用中的长度参数不正确。 应传递剩余字符数,而不是 <variable> 的缓冲区大小

此警告意味着在调用字符串串联函数时,所传递的表示串联字符数的值可能不正确。 此缺陷可能会导致可利用的缓冲区溢出或系统故障。 导致此缺陷的常见原因是传递给字符串操作函数的是缓冲区大小,而不是缓冲区内的剩余字符数。

示例

下面的代码生成此警告:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  char *szState ="Washington";
  char *szCity="Redmond, ";

  strncpy(szTarget,szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); //wrong size 
  // code ...                                 
}

若要更正此警告,请使用正确的串联字符数,如下面的代码所示:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  char *szState ="Washington";
  char *szCity="Redmond, ";

  strncpy(szTarget,szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - strlen(szTarget)); // correct size 
  // code ...                                 
}

若要使用安全的字符串操作函数来更正此警告,请参见下面的代码:

#include <string.h>

void f( )
{
  char *szState ="Washington";
  char *szCity="Redmond, ";

  size_t nTargetSize = strlen(szState) + strlen(szCity) + 1;
  char *szTarget= new char[nTargetSize];

  strncpy_s(szTarget, nTargetSize, szCity,strlen(szCity));
  strncat_s(szTarget, nTargetSize, szState,
                    nTargetSize - strlen(szTarget));
  // code ...
  delete [] szTarget;
}

请参见

参考

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l