編譯器警告 (層級 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
}