mcheck, mcheck_check_all, mcheck_pedantic, mprobe - Vérifier la
cohérence du tas
Bibliothèque C standard (
libc,
-lc)
#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);
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é.
If the system detects an inconsistency in the heap, the caller-supplied function
pointed to by
abortfunc is invoked with a single argument,
mstatus, that indicates what type of inconsistency was detected. If
abortfunc is NULL, a default function prints an error message on
stderr and calls
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.
mcheck() et
mcheck_pedantic() renvoient 0 en cas de succès,
-1 en cas d'erreur.
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.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
mcheck(), mcheck_pedantic(), mcheck_check_all(),
mprobe() |
Sécurité des threads |
MT-Unsafe race:mcheck const:malloc_hooks |
Ces fonctions sont des extensions GNU.
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.
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
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
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);
}
malloc(3),
mallopt(3),
mtrace(3)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]> et David Prévot <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]