共用方式為


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