楼主:
Petyr (小指头)
2017-08-21 01:46:37小弟程式算是新手
最近遇到一个很头大的 free() invaild pointer 的bug
也爬过有关于free的文章百思不得其解
想来请教一下各位前辈
程式码大略是这样的
合理怀疑是 buffer overflow,问题出在你没写明之处检查 A 段程式是否意外覆蓋了这两个变量
作者:
FRAXIS (喔喔)
2017-08-21 02:41:00在 b malloc 的时候先印出来内存位置然后在 free b 的时候确认是不是同一个位置如果不一样 那代表变量被改变过了如果一样 那可能是重复 free 或是 malloc 本身的资讯已经被搞坏了..
malloc a b之后 先确定ab不是null吧if(a == NULL) assert("error");然后自己加一些debug讯息判断一下发生什么事
作者:
mike0227 (我又小看了那复杂的世界)
2017-08-21 03:58:00free(NULL);是合法的。pointer一定被动到或是没malloc
Free 完把ptr 指到null 才是好习惯 建议先改了以后看中间是不是有哪里改到然后建议你抽出有问题的片段 贴可以重现bug 的程式上来一开始宣告没要马上用的话 最好也指到null 较容易debug话说a用不到pointer 为啥不在b里面宣告?
我比较倾向于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不知到关掉优化会不会有影响
作者: stucode 2017-08-21 20:47:00
即使简化 建议至少要贴“最小可重现问题的程式码”这可以训练你发现问题的能力 有时甚至会直接解决
作者:
enonrick (EnonRick)
2017-08-21 23:48:00楼上们超强的,一点像样的snippet都没有也讨论得起来
作者:
CoNsTaR ((const *))
2017-08-22 01:56:00其实楼主如果有能力找到最小可重现问题的程式码的话,那他其实也不用上来问了
好好奇啊 要是原po真的很害羞的话可以私我我帮你看再帮你抽出有问题的地方贴上来
作者:
linotwo (._.)
2017-08-23 04:40:00a b 变量直接宣告在 B 的 scope 里面比较好有可能是 A 里面有地方去非法覆蓋到 heap 资讯
作者:
tinlans ( )
2017-08-25 12:11:00很多实作是把配置资讯黏在 malloc() 传回位址之前,如果那块空间被当阵列存取,索引值不小心是负值时就可能把它盖掉,然后 free() 就会认为这块空间之前没配置过。