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
-lmcheck 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.65 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> ».