Skip to content

Instantly share code, notes, and snippets.

@multun
Last active October 18, 2019 23:30
Show Gist options
  • Save multun/93ddf447b44e04534cbb5ef19aead4f0 to your computer and use it in GitHub Desktop.
Save multun/93ddf447b44e04534cbb5ef19aead4f0 to your computer and use it in GitHub Desktop.
malloc.md

Introduction

Il y a beaucoup, mais alors beaucoup de manières d'implémenter un allocateur mémoire. Trop pour les lister ici sans y passer vraiment beaucoup de temps. Ainsi, seuls les aspects généraux seront évoqués.

Debug son malloc

Si vous lisez ce message, c'est que votre malloc ne marche pas. Terrible, non ? Que faire !

Généralités

  • vous ne devez pas appeler printf (printf appelle malloc) si vous avez un tinyprintf() fonctionnel, vous pouvez l'utiliser pour log des informations sur le fonctionnement interne de votre allocateur. ça vous permettra d'avoir un historique des événements clair. Sinon utilisez https://gist.github.com/multun/a09cc505b715db8065caca9b45ad7cec
  • vous voulez faire rater votre allocateur le plus tôt possible, s'il rate
  • utilisez un debuggeur dès que vous savez quoi faire avec
  • si votre programme plante après moins d'une dizaine allocations, un dernier recours peut être de single-step avec gdb jusqu'à ce que quelque chose vous semble incohérent. c'est un dernier recours, et évitez d'aller trop vite, on ne retourne pas dans le passé.
  • certains programmes, comme VLC, utilisent d'autres fonctions que malloc pour allouer de la mémoire, comme posix_memalign. Elles déjà sont implémentées, mais par le malloc de la libc :) vous risques de recevoir des pointeurs étranges dans votre free(), c'est normal pour ces quelques programmes. Ça n'arrive pas sur les programmes de base.

first / best fit / avec des chaines de blocs / métadonnées internes

La plupart des problèmes difficiles à débugger sont dûs à la corruption de métadonnées. À un moment, quelque part, vous renvoyez à l'utilisateur un espace trop petit pour ce qu'il a demandé.

  • votre but, c'est de faire rater votre programme tôt
  • vous devriez aussi pouvoir détecter un bloc de métadonnées corrompu. rajoutez deux champs à votre structure de métadonnées: un au début, et un à la fin. ces champs doivent être initialisés une valeur constante particulière (42 par exemple). Si vous lisez le bloc à nouveau et que ce champ a une autre valeur, vous venez de détecter un problème plus tôt, vous vous rapprochez de la solution !
  • vous devriez être capable d'itérer sur tous vos blocs, libres ou alloués
  • implémentez une fonction metadata_check() qui parcours toutes vos métadonnées, et vérifie qu'elles soient valides, grâce à la valeur particulière de leurs métadonnées.
  • vous devriez vous assurer que les blocs que vous renvoyez à l'utilisateur sont utilisables: quand un bloc est délimité, commencez par vérifier que les métadonnées sont valides avec metadata_check(). Initialisez le bloc à une valeur particulière, comme 12, ou 0, sur toute la longueur de la taille demandée par l'utilisateur. Ensuite, vérifiez à nouveau vos métadonnées. Si cette deuxième vérification échoue, c'est que ce bloc en particulier a été mal alloué.
  • quand un bloc est libéré, vous pouvez memset la partie inutilisée à 0. puis appeler metadata_check(). Cela permet de détecter plus tôt la corruption mémoire
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment