2013-03-10 93 views
0

我正在通过gdb运行程序。它运行“free(buffer)”;“那么我得到这个消息: 程序收到信号SIGSEGV,分段错误。什么是“ar_ptr = arena_for_chunk(p);”意思?

0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987 
2987  ar_ptr = arena_for_chunk(p); 

程序中的下一行是“fclose(inptr);”我该如何开始解决这个问题?

+0

这两个答案中的任何一个对你有帮助吗?如果是这样,接受其中一个(点击勾号)并且提高它(点击向上的三角形)将是有建设性的。如果他们都帮助,upvote和剔最有用的一个。如果没有帮助,解释为什么,我相信你会得到更多的帮助...... – 2013-03-11 19:58:35

回答

1

您的变量buffer为空或指向无法释放(或已释放)的内存。

+3

或者'malloc'保存的信息。 – cnicutar 2013-03-10 20:22:51

+0

C标准规定:_'free'函数会导致'ptr'指向的空间被释放,也就是说,可用于进一步分配。如果'ptr'是空指针,则不会发生任何操作._ – Armali 2014-06-05 11:40:40

1

你的问题的实际答案是ar_ptr = arena_for_chunk(p);是一个内部数据结构,它决定了内存应该释放到哪里。然而,如果你喜欢,你可以继续挖掘,直到你发现为什么p几乎可以肯定是你传入的buffer或者与它密切相关的某个值是“不正确的” - 但是这有点像在寻找你丢弃的密钥街灯,因为你可以在那里看到更好的,而不是试图找到他们放在他们的地方。

当标准库中的代码崩溃时,特别是每次运行任何不重要的程序时调用的代码,那么它由“坏的输入”引起的时间为99.9% - 请查看调用该函数的代码,而不是内部该函数(尽管值得回顾一下哪些错误来确定导致问题的哪个输入参数)。

实际的问题是,你的代码调用free()一个坏的参数,这使得arena_for_chunk要做错事 - 给定的值mem = 0xbffff11e在上面的线,我想到的是buffer实际上是在栈上的值,这不应该被释放。