C6053

警告 C6053: <関数> への呼び出しは、文字列 <変数> を 0 で終了しない可能性があります

この警告は、指定された関数が呼び出され、結果の文字列が 0 で終了しない可能性がある場合を示します。 この欠陥により、悪用される可能性があるバッファー オーバーランまたはクラッシュが発生する可能性があります。 この警告は、null で終了する文字列に null 終了ではない文字列が渡されることを注釈付き関数が予期する場合にも生成されます。

ほとんどの C 標準ライブラリと Win32 文字列操作の関数では、ゼロ終了の文字列が必要で、生成されます。 いくつかの 'counted string' 関数 (strncpywcsncpy_mbsncpy_snprintfsnwprintf を含む) では、バッファーが完全に埋められると、0 で終了する文字列は生成されません。 この場合、0 で終了する文字列を予期する文字列関数への後続の呼び出しでは、バッファーの末尾を超えてゼロが検索されます。 プログラムは、文字列の末尾が 0 であることを確認する必要があります。 一般に、バッファーのサイズより 1 小さい長さを 'counted string' 関数に渡し、バッファー内の最後の文字に 0 を明示的に割り当てる必要があります。

この警告が発生するコード例を次に示します。


#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX);
  return strlen(szDest); // possible crash here
}

この警告を修正するには、次のサンプル コードに示すように、文字列を 0 で終了します。


#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX-1);
  szDest[MAX-1]=0;
  return strlen(szDest);
}

次のサンプル コードでは、安全な文字列操作関数 strncpy_s を使用して、この警告を修正します。


#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource= "Hello, World!";

  strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));
  return strlen(szDest);
}

この警告は、実際には安全であることが保証される特定の表現でレポートされる場合があることに注意してください。 この欠陥の頻度と潜在的な重要性のために、解析ツールは、ノイズを減らすこと (こちらが一般的) に偏らずに、潜在的な問題を見つけることに偏ります。

関連項目