原文
以演示樣例**系統的講述了三種記憶體損壞的情況: 全域性記憶體、棧損壞及堆損壞, 以及它們產生的原因。
粗略整理例如以下。
即全域性變數的記憶體使用出了問題,主要還是越界。
例如以下**:
#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中檢測記憶體洩露可以使...