共用方式為


編譯器警告 (層級 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的詳細資訊,請參閱 warningPragma 指示詞和 __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
}