函数中堆内存写越界问题

在一个函数调用时候,分配一个堆,在堆的最底层应该是这个函数的返回指针(就是调用的如口,执行完这个函数后要往下执行的地址)如后才是函数参数的入栈过程,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 错误。

 

Linux中的是用于动态分配内存的一块区域,用于存储程序运行时的动态数据。堆内存越界指的是在堆内存分配的区域之外进行读操作。 堆内存越界可能导致以下问题: 1. 数据损坏:当在堆内存分配区域之外进行操作时,可能会覆盖掉其他程序使用的内存,导致数据的损坏。这可能导致程序运行不正常或崩溃。 2. 安全问题:恶意用户可以利用堆内存越界来修改其他程序的内存数据,实施攻击,例如缓冲区溢出攻击。这可能导致系统的安全漏洞和数据泄露。 3. 内存泄漏:当在堆内存分配之外进行读操作时,程序可能会访问到未分配的内存区域,造成内存泄漏。这些未分配的内存无法被释放,导致内存占用过多,最终导致系统性能下降。 为了避免堆内存越界问题,可以采取以下措施: 1. 使用堆内存分配函数:在使用堆内存时,应该使用操作系统提供的堆内存分配函数(例如malloc或new),这样可以确保内存的正确分配和释放。 2. 控制内存访问范围:在编程过程中,应该严格控制对堆内存的访问范围,确保不会越界访问。 3. 使用工具进行检测:可以使用一些工具(例如Valgrind)来检测内存越界问题,这些工具可以提供详细的报告和警告,帮助开发人员发现和修复问题。 总之,堆内存越界是一种常见的程序错误,可能导致程序崩溃、数据损坏和安全漏洞。开发人员应该注意编安全的代码,并采取相关措施来避免和修复堆内存越界问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值