記憶體損壞問題的演示樣例及分析

2021-09-07 05:44:10 字數 2204 閱讀 1663

原文

以演示樣例**系統的講述了三種記憶體損壞的情況: 全域性記憶體、棧損壞及堆損壞, 以及它們產生的原因。

粗略整理例如以下。

即全域性變數的記憶體使用出了問題,主要還是越界。

例如以下**:

#include #define max 6

int arrdata[max];

int endval;

int main()

printf("values are \n");

for (i = 0; i < max; i++)

return 0;

}

編譯執行,輸出的結果是:

values are

19044

19321

19600

19881

20164

20449

走查**,你能夠發現第乙個迴圈裡i的初值是max, 應該是max-1。

正是這個越界,改寫了endval的值。

那個全域性變數在記憶體裡是鄰居(譯註:在我的mac os上的輸出結果):

(gdb) p &endval

$2 = (int *) 0x100001038

(gdb) p &arrdata

$3 = (int (*)[6]) 0x100001020

所以arrdat[max]的賦值操作,實際變成了對endval的賦值。

這種破壞操作能夠概括為兩種:

在*nix系的系統裡,stack會用來儲存區域性變數, 函式引數以及返回值。棧損壞經常導致未知的行為及崩潰。

棧損壞有兩種情況:

越界的情況和之前類似,僅僅是發生在了棧儲存的資料上。比方以下的** :

#include #include #define len 6

void cpyprint(char *str)

int main()

編譯執行就會崩潰。

以下是在我的mac os上的結果:

(gdb) r

starting program: /volumes/development/project/testing/stackcorrupt

reading symbols for shared libraries +.............................. done

program received signal sigabrt, aborted.

0x00007fff88815d46 in __kill ()

(gdb) bt

#0 0x00007fff88815d46 in __kill ()

#1 0x00007fff8602d053 in __abort ()

#2 0x00007fff85fee74d in __chk_fail ()

#3 0x00007fff85feea1f in __strcpy_chk ()

#4 0x0000000100000ea6 in cpyprint (str=0x100000f3e "mylinux") at stackcorrupt.c:8

#5 0x0000000100000ef3 in main () at stackcorrupt.c:17

原因在cpyprint函式中的區域性變數大小為6,卻要放進去8個字元(包含乙個結束符)。

以下是棧溢位問題的演示樣例**:

#include int recur(long int var)

printf("the var is %ld\n", var);

return var;

}int main()

這段**什麼時候崩。還要看在執行的系統裡的棧大小的設定,能夠使用以下的指令直接查到:

$ulimit -s

預設情況下會是8192 (kbytes)。

出現堆錯誤。會報臭名昭著的segment fault錯誤。產生的原因有三種:

以下是乙個演示樣例:

#include #include int main()

要想排查記憶體問題,首選工具自然是valgrind了,不多做介紹了。

python pickle的使用詳解及樣例

pickle模組是以二進位制的形式序列化後儲存到檔案中 儲存檔案的字尾為 pkl 不能直接開啟進行預覽。而python的另乙個序列化標準模組json,則是human readable的,可以直接開啟檢視 例如在notepad 中檢視 import pickle a with open text.tx...

C語言整型提公升的規則及樣例詳解

什麼是整型提公升?整型提公升是c程式語言中的一項規定 在表示式計算時,各種整形首先要提公升為int型別。表示式的整型運算要在cpu的相應運算器件內執行,cpu內的整型運算器的運算元的位元組長度一般是int 型別的位元組長度,即四個位元組。因此即使是兩個char char型別為乙個位元組 型別的數相加...

Delphi的記憶體管理及記憶體洩露問題

這幾天因為乙個程式長時間執行出現比較嚴重的記憶體洩露問題,開始關注了一下記憶體管理方面的東西,以前也注意記憶體管理,建立了物件及時釋放,但總有忘了處理的情況。在delphi中沒有自動 機制,所以一定要及時釋放使用的記憶體,雖然有時小的記憶體洩露並不會造成太大的問題。delphi中檢測記憶體洩露可以使...