内存越界问题

一、背景 
最近手上的项目出现一个如下的BUG,在网上查了查原来是内存越界的问题。 
* glibc detected ./test5: malloc(): memory corruption: 0x2f300b08 **

二、延伸 
1、通常我们会犯的内存问题大概有以下几种: 
1.内存重复释放,出现double free时,通常是由于这种情况所致。 
2.内存泄露,分配的内存忘了释放。 
3.内存越界使用,使用了不该使用的内存。 
4.使用了无效指针。 
5.空指针,对一个空指针进行操作。

第四种情况,通常是指操作已释放的对象,如: 
1.已释放对象,却再次操作该指针所指对象。 
2.多线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一线程继续对该对象进行操作。

第三种情况相对于另几种情况,可以称得上是疑难杂症了(第四种情况也可以理解成内存越界使用)。 
内存越界使用,这样的错误引起的问题存在极大的不确定性,有时大,有时小,有时可能不会对程序的运行产生影响,正是这种不易重现的错误,才是最致命的,一旦出错破坏性极大。通常可能会造成如下后果: 
1.破坏了堆中的内存分配信息数据,特别是动态分配的内存块的内存信息数据,因为操作系统在分配和释放内存块时需要访问该数据,一旦该数据被破坏,以下的几种情况都可能会出现。 
* glibc detected * free(): invalid pointer: 
* glibc detected * malloc(): memory corruption: 
* glibc detected double free or corruption (out): 0x00000000005c18a0 ** 
* glibc detected corrupted double-linked list: 0x00000000005ab150 ** 
2.破坏了程序自己的其他对象的内存空间,这种破坏会影响程序执行的不正确性,当然也会诱发coredump,如破坏了指针数据。 
3.破坏了空闲内存块,很幸运,这样不会产生什么问题,但谁知道什么时候不幸会降临呢? 
通常,代码错误被激发也是偶然的,也就是说之前你的程序一直正常,可能由于你为类增加了两个成员变量,或者改变了某一部分代码,coredump就频繁发生,而你增加的代码绝不会有任何问题,这时你就应该考虑是否是某些内存被破坏了。 排查的原则,首先是保证能重现错误,根据错误估计可能的环节,逐步裁减代码,缩小排查空间。检查所有的内存操作函数,检查内存越界的可能。 
2、常用的内存操作函数: 
sprintf snprintf 
vsprintf vsnprintf 
strcpy strncpy strcat 
memcpy memmove memset bcopy

三、教训 
经过这次的问题,让我清楚地认识到内存操作的危险性,想想自己当初在写代码时的漫不经心,以后在操作内存时一定要慎之又慎。

四、补充 
项目的这个内存越界的问题还没找到出错点,又报出一个这样的错误: 
Alignment trap: not handling instruction e1942f9f at [<2bbe7bdc>] 
Unhandled fault: alignment exception (0x001) at 0x4fe64c11ing… 
在网上查了一下,有人也是因为内存越界的问题导致的错误报出,故推测我的这个错误也是由于内存越界的问题导致的。

参考:https://blog.csdn.net/light_in_dark/article/details/60959530

猜你喜欢

转载自blog.csdn.net/morixinguan/article/details/81702706
今日推荐