现在的位置: 首页 > 综合 > 正文

函数中堆内存写越界问题

2019年11月23日 ⁄ 综合 ⁄ 共 595字 ⁄ 字号 评论关闭

在一个函数调用时候,分配一个堆,在堆的最底层应该是这个函数的返回指针(就是调用的如口,执行完这个函数后要往下执行的地址)如后才是函数参数的入栈过程,C和C++的在函数前的修饰符决定了参数的入栈顺序。

在一个函数中定义一个常量数组。

 WCHAR pwText[16];
 WCHAR *pc = L"11111222222222222222222111111111111111111111111222222222222222222111111111111111111111111222222222222222222111111111111111111111";

lstrcpyn(pwText,pc, 10000);

 

执行到这里的时候没有错误。当不保证后面就正确了。这个时候应该已经把这个堆栈写乱了。

当函数返回后,在Debug版中将报告。而在release版本中将报告一个缓冲区溢出。应用的可能写到了堆栈外面,破话了自己或其他程序执行,严重可能导致系统奔溃。

因为函数的返回地址被写成了其他值。在一些病毒或者是木马中常常使用这个原理进行程序运行拦截,插入执行恶意代码。

 

在写程序的时候对这类操作一定要检查好你的数组的长度。

 

在程序中调用new的时候,如果new的内存太大,也将导致程序的异常。
 WCHAR *ps = new WCHAR [10000000000];

在debug的时候,导致out of memory 错误。

 

抱歉!评论已关闭.