【发布时间】:2019-10-04 06:19:29
【问题描述】:
我不明白获取错误的条件 - 损坏的双链表(不小) -
程序中有一点由于损坏的双链表(不小)而崩溃。
此时,我不想知道它为什么崩溃,但我想知道这个条件是如何工作的
if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0) || __builtin_expect(P->bk_nextsize->fd_nextsize != P, 0))
malloc_printerr (check_action,"corrupted double-linked list (not small)", P, AV);
这里我们可以看到当P->fd_nextsize->bk_nextsize != P 没有完成或者P->bk_nextsize->fd_nextsize 没有完成的时候观察到错误的双链表。
但我的主要问题是我无法解释这部分代码 - P->fd_nextsize->bk_nextsize - 期望是 P。我期望 P->fd_nextsize->bk_nextsize 是 P->bk_nextsize。
也许我对 bin 中双链表的结构感到困惑。
此时,我将双链表理解为:
+------------------->+----------------+ <---------+
| | fd_nextsize | |
| | | |
| | | |
| +----------------+ |
| | | |
| |fd_nextsize | |
| | | |
| +----------------+ |
| | | |
| +bk_nextisize |--------------------+
| | | | |
| +----------------+ | |
| | |
| | |
| | |
| | |
| +---------------+ | |
| | P | | |
| | | | |
| +---------------+ | |
| | | | |
| |fd_nextsize +-----------+ |
| | | |
| +---------------+ |
| | | |
| +-----------+bk_nextsize | |
| | | | |
| | +---------------+ |
| | |
| | |
| | |
| +----------->+----------------+<-----------------+
| | bk_nextisize |
| | |
| | |
| +----------------+
| | |
+----------------------+ fd_nextsize |
| |
+----------------+
|bk_nextsize |
| |
+----------------+
所以,如果我对 bin 中的双链表的理解不正确(重要信息,根据代码以及我们使用 fd_nextsize 和 bk_nextsize 的事实,这个块不在 smallbin 中)请纠正我。因为此时此刻,这个条件对我来说没有任何意义。
【问题讨论】:
标签: malloc free glibc corruption bins