コンパイラの警告 (レベル 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
の詳細については、「 warning
および Pragma ディレクティブ」および「 __Pragma
キーワード」を参照してください。
/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
}