[問題] 關於free()這個函數的使用

作者: Petyr (小指頭)   2017-08-21 01:46:37
小弟程式算是新手
最近遇到一個很頭大的 free() invaild pointer 的bug
也爬過有關於free的文章百思不得其解
想來請教一下各位前輩
程式碼大略是這樣的
作者: Schottky (順風相送)   2017-08-21 01:50:00
合理懷疑是 buffer overflow,問題出在你沒寫明之處檢查 A 段程式是否意外覆蓋了這兩個變數
作者: FRAXIS (喔喔)   2017-08-21 02:41:00
在 b malloc 的時候先印出來記憶體位置然後在 free b 的時候確認是不是同一個位置如果不一樣 那代表變數被改變過了如果一樣 那可能是重複 free 或是 malloc 本身的資訊已經被搞壞了..
作者: winken2004 (新竹肥宅)   2017-08-21 03:15:00
malloc a b之後 先確定ab不是null吧if(a == NULL) assert("error");然後自己加一些debug訊息判斷一下發生甚麼事
作者: mike0227 (我又小看了那複雜的世界)   2017-08-21 03:58:00
free(NULL);是合法的。pointer一定被動到或是沒malloc
作者: steve1012 (steve)   2017-08-21 04:47:00
Free 完把ptr 指到null 才是好習慣 建議先改了以後看中間是不是有哪裡改到然後建議你抽出有問題的片段 貼可以重現bug 的程式上來一開始宣告沒要馬上用的話 最好也指到null 較容易debug話說a用不到pointer 為啥不在b裡面宣告?
作者: b0920075 (Void)   2017-08-21 08:16:00
我比較傾向於overflow造成chunk的info被動到,這樣有沒有設成null應該都會出錯當然pointer被改掉也是很有可能
作者: descent (「雄辯是銀,沉默是金」)   2017-08-21 17:08:00
你先把 char *a, char *b 改成全域變數來宣告,看看是否正常?
作者: jerryh001   2017-08-21 17:13:00
貼原始code吧 不然只能搬水晶球了
作者: Lipraxde (Lipraxde)   2017-08-21 17:40:00
不知到關掉優化會不會有影響
作者: grayStone (灰色石頭)   2017-08-21 17:42:00
source code
作者: stucode   2017-08-21 20:47:00
即使簡化 建議至少要貼「最小可重現問題的程式碼」這可以訓練你發現問題的能力 有時甚至會直接解決
作者: enonrick (EnonRick)   2017-08-21 23:48:00
樓上們超強的,一點像樣的snippet都沒有也討論得起來
作者: CoNsTaR ((const *))   2017-08-22 01:56:00
其實樓主如果有能力找到最小可重現問題的程式碼的話,那他其實也不用上來問了
作者: Schottky (順風相送)   2017-08-22 02:08:00
@enonrick 我們上次有團購壓克力水晶球
作者: steve1012 (steve)   2017-08-22 04:20:00
好好奇啊 要是原po真的很害羞的話可以私我我幫你看再幫你抽出有問題的地方貼上來
作者: linotwo (._.)   2017-08-23 04:40:00
a b 變數直接宣告在 B 的 scope 裡面比較好有可能是 A 裡面有地方去非法覆蓋到 heap 資訊
作者: tinlans ( )   2017-08-25 12:11:00
很多實作是把配置資訊黏在 malloc() 傳回位址之前,如果那塊空間被當陣列存取,索引值不小心是負值時就可能把它蓋掉,然後 free() 就會認為這塊空間之前沒配置過。

Links booklink

Contact Us: admin [ a t ] ucptt.com