次の方法で共有


C6053

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

この警告は、結果の文字列が 0 で終了しないような方法で、指定された関数が呼び出されたことを示します。この問題によって、攻撃に利用される可能性のあるバッファー オーバーランまたはクラッシュが発生する場合があります。この警告は、null で終了する文字列が終了する null でない文字列が渡されたことを指定された関数が要求すると生成されます。

ほとんどの C 標準ライブラリおよび Win32 文字列処理関数では、0 で終了する文字列が必要とされ、生成されます。一部の "計数文字列" の関数 (strncpy、wcsncpy、_mbsncpy、_snprintf、および snwprintf) は、関数のバッファーが正確に満たされている場合、0 で終了する文字列を生成しません。この場合、次に 0 で終了する文字列を想定する文字列関数を呼び出したときに、バッファーの終端を超えて 0 が検索されます。プログラムで、文字列が 0 で終わることを確認する必要があります。一般に、はバッファーのサイズより小さい計数文字列 " 関数に長さ 1 を渡してから、バッファー内の最後の文字を明示的に値を割り当てます。

使用例

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

#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);
}

実際には安全なことが保証されている用法でも、この警告が報告されることがあるので注意してください。この問題の頻度と引き起こされる可能性のある結果のため、分析ツールは、ノイズを減少するための一般的なバイアスよりも潜在的な問題を発見することを優先するようにバイアスされています。

参照

関連項目

strncpy_s、_strncpy_s_l、wcsncpy_s、_wcsncpy_s_l、_mbsncpy_s、_mbsncpy_s_l

その他の技術情報

注釈の概要

NullTerminated