我正在重写一个自定义malloc,我希望能够在双重释放或损坏时抛出glibc错误,而不是经典的SegFault。这可能吗?
*** glibc detected *** a.out: double free or corruption (fasttop): 0x0804b048 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6ff0b)[0xb74baf0b]
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7671b4f]
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xb7671b9b]
a.out[0x8048983]
a.out[0x8048b12]
a.out[0x80487d7]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
Aborted
我认为这并不容易做到,因为当调用 free() 两次时不会抛出异常 - 就像在尝试分配内存和 alloc 失败的情况下一样 - 这是相当未定义的行为。查看这篇文章以获取更多详细信息。
你可以做的是实现你自己的机制来跟踪分配/解除分配的内存 - 有点像智能指针的工作方式。只有您会专门尝试识别内存何时被释放两次。
我认为您必须执行自己的回溯/错误消息并将其显示在错误输出中。
您还应该查看 abort(3)。
自己抛出错误而不是段错误,你必须检查做段错误的可能性是什么,然后返回你想要的消息。您可以捕获它并将其重定向到将执行一些检查的函数中。
例如,您可以检查内存是否已可用。
你是如何完成你的定制malloc的? brk 和 sbrk ?