分享方式:


警告 C6059

呼叫 『function』 的長度參數不正確。 傳遞剩餘字元數,而不是 『variable』 的緩衝區大小。

備註

這個警告表示對字串串連函式的呼叫可能會傳遞不正確的值來串連字元數。 此瑕疵可能會導致惡意探索緩衝區滿溢或當機。 此缺陷的常見原因是將緩衝區大小(而不是緩衝區中的剩餘字元數目)傳遞給字串操作函式。

此警告有助於識別傳送目標緩衝區大小而非數據大小的常見錯誤。 它會藉由偵測用來配置緩衝區的大小何時傳遞至將數據放入緩衝區的函式中,以執行此動作。

程式代碼分析名稱: BAD_CONCATENATION

範例

下列程式代碼會產生警告 C6059:

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const 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];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

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

若要使用安全字串操作函 strncpy_s 式和 strncat_s更正此警告,請參閱下列程式代碼:

#include <string.h>

void f( )
{
  const char *szState ="Washington";
  const 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;
}

啟發學習法

此分析會偵測何時未修改目標緩衝區大小傳遞至字串操作函式的 length 參數。 如果傳遞一些其他值做為 length 參數,即使該值不正確,也不會提供這個警告。

請考慮下列產生警告 C6059 的程式代碼:

#include <string.h>
#define MAX 25

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

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

即使長度計算仍然不正確,警告也會 MAX 將 自變數變更為 strncat MAX - 1。。

#include <string.h>
#define MAX 25

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

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

另請參閱