內存越界問題

一、背景
最近手上的項目出現一個如下的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…
在網上查了一下,有人也是因爲內存越界的問題導致的錯誤報出,故推測我的這個錯誤也是由於內存越界的問題導致的。

發佈了33 篇原創文章 · 獲贊 30 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章