Routines d’aide au débuggage pour la gestion de la mémoire vive en C

Fonctionnement

Chaque appel des fonctions malloc, calloc, realloc, et free de la librairie C standard est remplacé (sauf si la constante VERSION_FINALE est définie) par les appels de _MyMalloc, _MyCalloc, _MyRealloc et _MyFree en passant les arguments normalement attendus par les fonctions de la librairie C standard en ajoutant le nom du source, la ligne du source et si besoin la constante TFIL_ALLOC_SECOURS et l'adresse de la fonction ABORT_FCT (cf. GestMem.h).

Les fonctions _MyMalloc et _MyCalloc vont ensuite réaliser l'allocation et rendre un pointeur à l'appelant.

La fonction _MyCalloc fait appel à la fonction _MyMalloc puis initialise le contenu du pointeur avec la valeur 0 avant de rendre la main à l'utilisateur.

L'allocation consiste à demander un bloc mémoire à l'OS. Ce bloc mémoire a pour longueur la somme de :

Cet espace mémoire pointé par Ptr peut être représenté comme suit 

L'appel de la fonction _MyMalloc va renseigner les parties CTRL1, Source ,Ligne ,Longueur, CTRL2 et ajoute le pointeur Ptr dans une liste linéaire chaînée dont la racine est Racine via la fonction AjouterLLC.

Les fonctions _MyFree et _MyRealloc via vérifient, via CheckPtr que CTRL1 est bien égal à 0XABCD .

Si ce n'est pas le cas, les valeurs suivantes n'ont probablement aucun sens (un autre pointeur mal renseigné a tout cassé). La fonction affiche un message d'erreur fatal en indiquant le nom du source et la ligne ou a eu lieu l'appel de la fonction qui a déclenché la vérification et appelle abort.

Si CTRL1 est égal à 0xABCD, alors les informations suivantes ont probablement un sens.
La fonction compare donc la valeur CTRL2 à 0xABCD. Si CTRL2 est égal à cette valeur, il n'y a probablement pas eu d'écrasement, le pointeur Ptr est supprimé de la liste. La mémoire est libérée (ou réallouée avec _MyRealloc), l'exécution de la fonction se poursuit normalement. Si CTRL2 est différent de 0xABCD, alors on peut être presque sûr que l'utilisateur a demandé moins d'octets qu'il n'en a utilisés avec ce pointeur, on affiche alors un message d'erreur d'écrasement en indiquant le nom du source et la ligne où a eu lieu l'appel de la fonction qui a déclenché la vérification, le nom du source et la ligne ou a eu lieu l'allocation ou la réallocation et appelle la fonction dont l'adresse lui est passée en paramètre (par défaut abort).

La fonction _MyRealloc va d'abord vérifier un éventuel écrasement, supprimer le Ptr de la liste, demander la réallocation, mettre le nouveau Ptr dans la liste et rendre la main à l'utilisateur.

Routines d’aide au débuggage pour la gestion de la mémoire vive en C