Trois fautes de mémoire
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 1 — Le langage C
Énoncé
Identifier la faute dans chacun de ces trois fragments, et la nommer.
/* (a) */ int* t = malloc(10 * sizeof(int));
t[10] = 0;
/* (b) */ int* u = malloc(10 * sizeof(int));
free(u);
u[0] = 1;
/* (c) */ for (int i = 0; i < 1000; i = i + 1) {
int* v = malloc(100 * sizeof(int));
v[0] = i;
}Corrigé
- [(a)] Débordement de tampon. Le tableau a dix cases, d'indices à ;
t[10]écrit une case au-delà. Rien ne le signale : on corrompt une mémoire qui appartient à autre chose. - [(b)] Utilisation après libération (use after free). Après
free, le pointeur ne désigne plus rien de valide — la mémoire n'est pas effacée, elle est seulement rendue disponible. Le programme peut fonctionner mille fois puis échouer. - [(c)] Fuite de mémoire. Mille allocations, aucun
free: le programme consomme ko qu'il ne rendra jamais. Sur un service qui tourne des semaines, c'est ainsi qu'on épuise la mémoire d'une machine.
Les trois sont invisibles à la compilation, et les trois se détectent avec valgrind ou -fsanitize=address. La discipline qui les évite tient en une phrase : qui alloue documente qui libère.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.