NOM¶
mcheck, mcheck_check_all, mcheck_pedantic, mprobe - Vérifier la
cohérence du tas
SYNOPSIS¶
#include <mcheck.h>
int mcheck(void (*abortfunc)(enum mcheck_status mstatus));
int mcheck_pedantic(void (*abortfunc)(enum mcheck_status mstatus));
void mcheck_check_all(void);
enum mcheck_status mprobe(void *ptr);
DESCRIPTION¶
La fonction
mcheck() installe des fonctions de rappel
(« hook ») pour les fonctions d'allocation mémoire
malloc(3). Ces fonctions activent des vérifications de
cohérence de l'état du tas. Ces vérifications permettent de
détecter des erreurs telles que libérer plusieurs fois un bloc de
mémoire, ou corrompre les structures internes précédant le bloc
de mémoire allouée.
Pour être active, la fonction
mcheck() doit être appelée
avant le premier appel à
malloc(3) ou autre fonction
associée. S'il est difficile de s'en assurer, lier le programme avec
-mcheck ajoute un appel implicite à
mcheck() (avec un
paramètre NULL) avant le premier appel à une fonction d'allocation
mémoire.
La fonction
mcheck_pedantic() est similaire à
mcheck(), mais
effectue les vérifications pour tous les blocs alloués quelque soit
la fonction d'allocation mémoire appelée. Cela peut être
très lent !
La fonction
mcheck_check_all() déclenche une vérification
immédiate de tous les blocs alloués. Cet appel n'est pris en compte
que si
mcheck() a déjà été appelé.
Si le système détecte une incohérence dans le tas, la fonction
fournie lors de l'appel dans
abortfunc est invoquée avec le
paramètre
mstatus qui indique le type d'incohérence
détectée. Si
abortfunc est NULL, la fonction par défaut
affiche un message d'erreur sur
stderr et appelle
abort(3).
La fonction
mprobe() effectue une vérification de cohérence du
bloc de mémoire allouée pointé par
ptr. La fonction
mcheck() doit avoir été déjà appelée, ou
mprobe() renverra
MCHECK_DISABLED.
La liste suivante décrit les valeurs renvoyées par
mprobe() ou
passées via le paramètre
mstatus lors de l'appel à
mstatus.
- MCHECK_DISABLED (seulement pour
mprobe())
- La vérification de cohérence n'a pu être
effectuée, car mcheck() n'a pas été appelé
avant le premier appel à une fonction d'allocation mémoire.
- MCHECK_OK (seulement pour mprobe())
- Aucune incohérence détectée.
- MCHECK_HEAD
- La mémoire précédant immédiatement le
bloc alloué a été altérée.
- MCHECK_TAIL
- La mémoire suivant immédiatement le bloc
alloué a été altérée.
- MCHECK_FREE
- Un bloc de mémoire a été libéré
deux fois.
VALEUR RENVOYÉE¶
mcheck() et
mcheck_pedantic() renvoient 0 en cas de succès,
-1 en cas d'erreur.
VERSIONS¶
Les fonctions
mcheck_pedantic() et
mcheck_check_all() sont
disponibles depuis la glibc 2.2. Les fonctions
mcheck() et
mprobe() sont disponibles depuis au moins la glibc 2.0.
Ces fonctions sont des extensions GNU.
NOTES¶
Lier le programme avec
-lmcheck comme utiliser la variable
d'environnement
MALLOC_CHECK_ (décrite dans
mallopt(3))
permettent de détecter le même type d'erreurs. Cependant,
MALLOC_CHECK_ ne nécessite pas de modifier l'édition de
liens.
EXEMPLE¶
L'exemple ci-dessous montre ce qu'il se passe lorsqu'un programme appelle
mcheck() avec un paramètre NULL puis libère le même bloc
de mémoire deux fois.
$ ./a.out
About to free
About to free a second time
block freed twice
Abandon
Source du programme¶
#include <stdlib.h>
#include <stdio.h>
#include <mcheck.h>
int
main(int argc, char *argv[])
{
char *p;
if (mcheck(NULL) != 0) {
fprintf(stderr, "échec de mcheck()\n");
exit(EXIT_FAILURE);
}
p = malloc(1000);
fprintf(stderr, "About to free\n");
free(p);
fprintf(stderr, "\nAbout to free a second time\n");
free(p);
exit(EXIT_SUCCESS);
}
VOIR AUSSI¶
malloc(3),
mallopt(3),
mtrace(3)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».