編譯器警告 (層級 1) C4789
大小 N 個位元組的緩衝區 ' identifier ' 將會滿溢; 從位移 L 開始寫入 M 位元組
備註
使用特定 C 執行時間 (CRT) 函式時,C4789 會警告緩衝區滿溢。 當傳遞參數或指派時,它也可以報告大小不符。 如果編譯時期已知資料大小,可能會發出警告。 這項警告是針對可能逃避一般的資料大小不符偵測的情況。
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
}