分享方式:


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