Adloun

informatique (MP2I/MPI) · Chapitre 1 · Exercice de TD

Trois fautes de mémoire

Le langage C · niveau 2

É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.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre