次の方法で共有


C6057

警告 C6057: 文字数またはバイト数が <関数> への呼び出しで一致していないためにバッファー オーバーランが発生しました。

この警告は、文字数が必要な関数にバイト数が渡されることを示します。 ワイド (Unicode) 文字の場合、バイト数の値が異なります。 この問題によって、攻撃に利用される可能性のあるバッファー オーバーランまたはクラッシュが発生する場合があります。

この問題の一般的な原因は、文字配列への sizeof の使用です。 sizeof 演算子では、常にバイト数が計算されます。ANSI 文字の場合、バイト数は文字数と同じになりますが、Unicode 文字の場合はバイト数が文字数の 2 倍になります。

通常は、配列のサイズを各要素のサイズで除算することで配列内の要素数を計算する方法が安全です。

使用例

次に示すコードでは、Unicode 文字セットを使用してコンパイルするとこの警告が生成されます。

#include<tchar.h>
#include<windows.h>

void f( HINSTANCE hInst, UINT uID )
{
  TCHAR buff[128];
  if ( LoadString ( hInst, uID, buff, sizeof buff ) ) // warning C6057
  {
    // code...
  }
}

この警告を修正するには、次のコードに示すように、配列のサイズを要素のサイズで除算します。

#include<tchar.h>
#include<windows.h>

void f(HINSTANCE hInst,UINT uID)
{
  TCHAR buff[128];
  if( LoadString ( hInst, uID, buff, (sizeof buff)/(sizeof buff[0]) ) )
  {
    // code...
  }
}

Visual C++ で Unicode 文字セットを使用する方法の詳細については、「[全般] プロパティ ページ (プロジェクト)」を参照してください。 LoadString の詳細については、「LoadString Function (LoadString 関数)」を参照してください。