编译器警告(等级 1)C4789

缓冲区“identifier”(大小为 N 字节)将溢出;M 字节将在偏移 L 时开始写入

备注

使用特定的 C 运行时 (CRT) 函数时,C4789 会警告缓冲区溢出。 它还可以在传递参数或进行分配时报告大小不匹配。 如果在编译时已知数据大小,则可能会出现该警告。 此警告针对那些可能会避开典型数据大小不匹配检测的情况。

将数据复制到在编译时已知非常小的数据块时,C4789 会发出警告

如果副本使用以下 CRT 函数之一的内部函数形式,则会出现该警告:

将参数强制转换为更大的数据类型,然后从 lvalue 引用分配副本时,也会出现该警告。

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
}