Как в malloc обнаружена поврежденная ошибка двойного связанного списка? - PullRequest
0 голосов
/ 17 мая 2019

Я не понимаю условие для gettint ошибка - поврежденный список с двумя связями (не маленький) -

В программе есть точка, в которой происходит сбой из-за поврежденного списка с двумя связями (немаленький).

В данный момент я не хочу знать, почему произошел сбой, но я хочу знать, как работают эти условия

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.

Может быть, меня смущает структура двойного связанного списка в корзинах.

В настоящий момент я понимаю двойной связанный список следующим образом:

+------------------->+----------------+ <---------+
|                    |  fd_nextsize   |           |
|                    |                |           |
|                    |                |           |
|                    +----------------+           |
|                    |                |           |
|                    |fd_nextsize     |           |
|                    |                |           |
|                    +----------------+           |
|                    |                |           |
|                    +bk_nextisize    |--------------------+
|                    |                |           |        |
|                    +----------------+           |        |
|                                                 |        |
|                                                 |        |
|                                                 |        |
|                                                 |        |
|                     +---------------+           |        |
|                     |  P            |           |        |
|                     |               |           |        |
|                     +---------------+           |        |
|                     |               |           |        |
|                     |fd_nextsize    +-----------+        |
|                     |               |                    |
|                     +---------------+                    |
|                     |               |                    |
|         +-----------+bk_nextsize    |                    |
|         |           |               |                    |
|         |           +---------------+                    |
|         |                                                |
|         |                                                |
|         |                                                |
|         +----------->+----------------+<-----------------+
|                      | bk_nextisize   |
|                      |                |
|                      |                |
|                      +----------------+
|                      |                |
+----------------------+ fd_nextsize    |
                       |                |
                       +----------------+
                       |bk_nextsize     |
                       |                |
                       +----------------+

Итак, если я ошибаюсь в своем понимании двойных связанных списков в корзинах (Важная информация, согласнок коду, а также в связи с тем, что мы используем fd_nextsize и bk_nextsize этот кусок не в маленькой корзине), пожалуйста, поправьте меня.Поскольку в данный момент это условие не имеет для меня никакого смысла.

1 Ответ

0 голосов
/ 27 мая 2019

Пример испорченного двойного списка с правильной диаграммой.

gef> x/200x victim
0x2c76330:      0x00000000      0x00000000      0x000004d1      0x00000000
0x2c76340:      0x140e8fb8      0x00007f12      0x140e8fb8      0x00007f12
0x2c76350:      0x02c15e48      0x00000000      0x02c76330      0x00000000
0x2c76360:      0x00000318      0x00000000      0x00000000      0x00000000

Here 

0x02c15e48    >>> fd_nextsize
0x02c76330    >>> bk_nextsize 

gef> x/100x 0x02c15e48
0x2c15e48:      0x02c76348      0x00000000      0x00000000      0x00000000
0x2c15e58:      0x00000019      0x00000000      0x09080003      0x0071db5c
0x2c15e68:      0xc0b51d4f      0x00000001      0x000000fa      0x00000000
0x2c15e78:      0x00000003      0x00007706      0x00007706      0x586a0001

0xc0b51d4f >>> victim->fd_nextisize->fd_nextsize
0x000000fa >>> vicitim->fd_nextsize->bk_nextsize  >>>>>>>>>>>>>>>>>>>>>>>>>>>>> This is not valid. 


gef> x/100x 0x02c76330
0x2c76330:      0x00000000      0x00000000      0x000004d1      0x00000000
0x2c76340:      0x140e8fb8      0x00007f12      0x140e8fb8      0x00007f12
0x2c76350:      0x02c15e48      0x00000000      0x02c76330      0x00000000
0x2c76360:      0x00000318      0x00000000      0x00000000      0x00000000

0x02c15e48 >>> victim->bk_nextsize->fd_nextsize
0x02c76330 >>> victim->bk_nextsize->bk_nextsize >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> This condition is valid.




   Double Linked Lists in GLIBC

             +----------------------+<------------------+
             |      ChunkA          |                   |
             +-----------------------+                  |
             |fd_nextsize           |                   |
             +----------------------+                   |
             |                      |                   |
         +---+bk_nextsize           |                   |
         |   +----------------------+                   |
         |                                              |
         |  +------------------------+<---------+       |
         |  |    ChunkB              |          |       |
         |  +------------------------+          |       |
         |  |fd_nextsize             |          |       |
         |  |                        |          |       |
         |  +------------------------+          |       |
+-----------+bk_nextsize             |          |       |
|        |  +------------------------+          |       |
|        |                                      |       |
|        +->+------------------------+<-----------------------------+
|           |      ChunkC            |          |       |           |
|           +------------------------+          |       |           |
|           |fd_nextsize             +------------------+           |
|           |                        |          |                   |
|           +------------------------+          |                   |
|    +------+bk_nextsize             |          |                   |
|    |      +------------------------+          |                   |
|    |                                          |                   |
+---------->+------------------------+          |                   |
     |      |        ChunkD          |          |                   |
     |      +------------------------+          |                   |
     |      |fd_nextsize             +----------+                   |
     |      +------------------------+                              |
     |      |                        |                              |
     |      |bk_nextsize             |                              |
     |      +------------------------+                              |
     |                                                              |
     +----> +------------------------+                              |
            |       ChunkE           |                              |
            +------------------------+                              |
            |fd_nextsize             +------------------------------+
            |                        |
            +------------------------+
            |bk_nextsize             |
            +------------------------+
...