警告 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 パラメーターとして渡された場合には与えられません。

警告 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 ...
}

長さの計算が正しくない場合でも、引数をMAXstrncat次に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 ...
}

関連項目