コンパイラの警告 (レベル 1) C4789

バッファー 'identifier' (サイズが N バイト) でオーバーランが発生します。M バイトがオフセット L から書き込まれます

解説

C4789 は、特定の C ランタイム (CRT) 関数の使用時のバッファー オーバーランについて警告します。 パラメーターが渡されるとき、または割り当てが行われるときにサイズの不一致を報告することもあります。 コンパイル時にデータ サイズがわかっている場合に、警告が発生する可能性があります。 この警告は、一般的なデータ サイズの不一致の検出が回避されるような状況のためのものです。

C4789 警告は、コンパイルの時点で小さすぎることがわかっているデータ ブロックにデータがコピーされると発生します。

この警告は、次のいずれかの CRT 関数の組み込み形式をコピーで使用する場合に発生します。

より大きなデータ型にパラメーターをキャストした後、左辺値参照からコピーの割り当てを行ったときにも、この警告が発生します。

Visual C++ では、決して実行されないコード パスに対してこの警告が生成されることがあります。 次の例に示すように、#pragma を使用して、警告を一時的に無効にすることができます。

#pragma warning( push )
#pragma warning( disable : 4789 )
// unused code that generates compiler warning C4789`
#pragma warning( pop )

このイディオムによって、Visual C++ が特定のコードのブロックに対して警告を生成しないようにすることができます。 #pragma warning(push) は、#pragma warning(disable: 4789) によって変更される前に、既存の状態を維持します。 #pragma warning(pop) はプッシュされた状態を復元し、#pragma warning(disable:4789) の効果を削除します。 C++ プリプロセッサ ディレクティブの詳細については、「Pragma ディレクティブ#pragma」および「キーワード」を__Pragma参照してくださいwarning

/sdl (追加のセキュリティ チェックを有効にする) コンパイラ オプションは、この警告をエラーに昇格させます。

次の例では C4789 が生成されます。

// C4789.cpp
// compile with: /Oi /W1 /c
#include <string.h>
#include <stdio.h>

int main()
{
    char a[20];
    strcpy(a, "0000000000000000000000000\n");   // C4789

    char buf2[20];
    memset(buf2, 'a', 21);   // C4789

    char c;
    wchar_t w = 0;
    memcpy(&c, &w, sizeof(wchar_t));
}

次の例でも C4789 が生成されます。

// C4789b.cpp
// compile with: /W1 /O2 /c
// processor: x86
short G;

int main()
{
   int * p = (int *)&G;
   *p = 3;   // C4789 - writes an int through a pointer to short
}