编译器警告(等级 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
}