Holy Shit!!!不小心犯了个低级错误——在使用数组时,下标使用时出错了(我一直想当然的没错,先入为主的观念),结果编译器就不干了,耗费了一点时间找出问题,但需要引以为戒!!!
编译器警告(等级 1)C478
Visual Studio 2013
内存复制的目标太小
在使用特定 C 运行时 (CRT) 函数、传递参数以及执行分配时对缓冲区溢出进行警告,以便在编译时了解数据大小。 此警告针对那些可能会避开典型数据大小不匹配检测的情况。
将长度在编译时已知的数据复制并放置到在编译时大小对于该数据来说太小的数据块中时,会出现该警告。 必须使用以下 CRT 函数之一的内部形式进行复制:
当参数数据类型由于使用强制转换而不匹配,并且随后尝试从左值引用进行复制赋值时,也会出现该警告。
Visual C++ 可能会对不曾执行的代码路径生成此警告。 可以使用 #pragma 暂时禁用该警告,如以下示例所示:
#pragma(push)
#pragma warning ( disable : 4789 )
// unused code that generates compiler warning C4789
#pragma(pop)
这会阻止 Visual C++ 针对该特定代码块生成该警告。 #pragma(push) 将保持现有状态,直到 #pragma warning(disable: 4789) 将其改变。 #pragma(pop) 会还原按下的状态,并移除 #pragma warning(disable:4789) 的效果。 有关 C++ 预处理器指令 #pragma 的更多信息,请参见警告和 Pragma 指令和 __Pragma 关键字。
下面的示例生成 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; void main() { int * p = (int *)&G; *p = 3; // C4789 }