关于数组溢出------warning C4789: 内存复制的目标太小



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
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值