次の方法で共有


警告 C6053

'function' の呼び出しでは、0 終了文字列 'variable' を使用できません。

解説

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

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

コード分析名: MISSING_ZERO_TERMINATION1

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

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

ヒューリスティック

この警告は、実際には安全であることが保証されている特定のイディオムで報告されることがあります。 この欠陥の頻度と潜在的な重要性のために、解析ツールは、ノイズを減らすこと (こちらが一般的) に偏らずに、潜在的な問題を見つけることに偏ります。

関連項目