
一、背景
最近,下列BUG出现在手头的项目中。我在Internet上对其进行了检查,结果发现这是一个内存越界问题。
*检测到glibc ./test5:malloc():内存损坏:0x2f300b08 **
二、扩展
1、通常,我们将遇到以下内存问题:
1.反复释放内存并出现两次空闲时,通常是由于这种情况。
2.内存泄漏,分配的内存忘记释放。

3.内存已超出使用范围,并且使用了不应使用的内存。
4.使用了无效的指针。
5.空指针,对空指针进行操作。
第四种情况通常是指释放的对象,例如:
1.释放了对象,但再次操作了指针指向的对象。
2.两个线程同时使用在多个线程中动态分配的对象,一个线程释放该对象,另一个线程继续对该对象进行操作。
与其他情况相比,第三种情况可以视为难治性疾病(第四种情况也可以理解为使用记忆力的超越范围)。

内存已超出范围。由此类错误引起的问题具有很大的不确定性,有时很大,有时很小,有时可能不会影响程序的运行。正是这种类型的错误不容易重现。最致命的是,一旦发生错误,它将具有极大的破坏力。通常可能会导致以下后果:
1.破坏了堆中的内存分配信息数据,尤其是动态分配的内存块的内存信息数据,因为操作系统在分配和释放内存块时需要访问该数据。数据被破坏后,可能会发生以下几种情况。
*检测到glibc * free():无效的指针:
*检测到glibc * malloc():内存损坏:
* glibc检测到双重释放或损坏(输出):0xc18a0 **
* glibc检测到损坏的双向链接列表:0xab150 **
2.破坏了程序本身其他对象的存储空间,这种破坏将影响程序的错误执行,当然还会引起coredump,例如破坏指针数据。

3.破坏了空闲内存块。幸运的是,这不会造成任何问题,但是谁知道何时会发生不幸?
通常,代码错误是偶然触发的。也就是说,您的程序以前是正常的。可能是因为您在类中添加了两个成员变量或更改了代码的特定部分。 Coredump经常发生,并且会增加代码永远不会有任何问题,那么您应该考虑某些内存是否已损坏。故障排除的原则是首先确保可以重现该错误,并根据该错误估计可能的链接,并逐渐减少代码以减少调查的空间。检查所有内存操作功能,检查内存超出范围的可能性。
2、常用的内存操作功能:
sprintf snprintf
vsprintf vsnprintf
strcpy strncpy strcat
memcpy memmove memset bcopy

三、课程
这个问题之后,我已经清楚地意识到了内存操作的危险。我在写代码时会考虑我的粗心大意,将来在操作内存时必须谨慎。
四、补充
项目的越界内存问题未找到错误点,并且报告了另一个类似错误:
对齐陷阱:不处理[]处的指令e1942f9f
未处理的错误:对齐异常(0x4fe64c11ing处为0x001)...
在Internet上进行检查后,有人报告是由于内存越界问题导致的错误,因此推测我的错误也是由内存越界问题引起的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-320254-1.html
自己都想推翻萨达姆