problème de mémoire lors de la réinitialisation

Samuel Hocevar sam at zoy.org
Tue Apr 17 13:54:00 CEST 2001


On Tue, Apr 17, 2001, Damien Lucas wrote:

> Question, quand on utilise MALLOC_CHECK,
>  qu'est-ce que ca ait fexactement ?

   Je ne sais pas fexactement ce que ça ait, mais je sais qu'au moins il
vérifie l'intégrité de la zone de données qu'on essaye d'allouer ou de
désallouer, en regardant les octets qui sont un peu avant. Si ça râle
alors qu'on est sûr de désallouer un truc alloué précédemment comme il
faut, alors c'est qu'on a débordé dans un buffer.

   J'essaye de aire un exemple. Ça c'est le tas avant un malloc :

   -------------------------------------------------------------
   | x |
   -------------------------------------------------------------

   'x' c'est un pointeur qui donne des infos sur ce qu'il y a après, en
gros le prochain truc libre, le précédent, et des trucs du genre. Si
maintenant on ait un malloc, on va se retrouver avec ça :

   -------------------------------------------------------------
   | x |   BLORP     | y |
   -------------------------------------------------------------

   Avec BLORP la zone qu'on vient d'allouer, et 'y' une nouvelle zone
d'information comme 'x', qui dit où est le morceau précédent, le
suivant, etc. On reait un malloc :

   -------------------------------------------------------------
   | x |   BLORP     | y |    BROOZLE    | z |
   -------------------------------------------------------------

   Et si maintenant on ait un free(BROOZLE), il va lire dans 'y' (qu'il
trouve à partir de l'adresse de BROOZLE) et updater tout ça :

   -------------------------------------------------------------
   | x |   BLORP     | y |
   -------------------------------------------------------------

   Maintenant, imaginons qu'un programmeur un peu porc, qui aurait par
exemple indexé son tableau BLORP de 1 à n au lieu de 0 à n-1, dépasse
un peu de BLORP. Ça va écrire des cochonneries dans 'y', et si on ait
un free(BROOZLE), il va lire n'importe quoi dans 'y', et il y a 99% de
chances que ça segfaulte tout de suite, ou au prochain malloc, ou que
malloc commence à avoir un comportement irrationnel.

   Si on a MALLOC_CHECK_ activé, il va aire des vérifications
supplémentaires sur 'y', et probablement dire "cette zone est corrompue,
on ne va plus y toucher", histoire que le programme continue à tourner.
Mais dès que MALLOC_CHECK_ ait le moindre warning c'est un bug.

-- 
Sam.




More information about the vlcs-devel mailing list