Partage via


Erreur : heap-use-after-free

Erreur d’assainissement de l’adresse : utilisation de la mémoire libérée

Nous montrons trois exemples où le stockage dans le tas peut être alloué via malloc, realloc (C) et new (C++), ainsi qu’une utilisation erronée de volatile.

Exemple- malloc

// example1.cpp
// heap-use-after-free error
#include <stdlib.h>

int main() {
  char *x = (char*)malloc(10 * sizeof(char));
  free(x);

  // ...

  return x[5];   // Boom!
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Lorsque Visual Studio s’affiche, appuyez F5 sur l’exemple 1 pour exécuter l’exemple 1.

Erreur résultante

Capture d’écran du débogueur affichant l’utilisation d’une erreur de mémoire libérée, par exemple 1.

La boîte de dialogue levée d’exception pointe vers la ligne 11, retourne x [ 5 ], et indique : Address Sanitizer Error Use of deallocated memory. Non affiché dans la capture d’écran est la sortie dans la fenêtre de console qui affiche les adresses mémoire et une clé permettant d’identifier les octets adressables, les octets partiellement adressables, les régions de tas libérées et les octets de zone rouge gauche dans la zone de l’erreur.

Exemple- operator new

// example2.cpp
// heap-use-after-free error
#include <windows.h>

int main() {
  char *buffer = new char[42];
  delete [] buffer;

  // ...

  buffer[0] = 42;  // Boom!
  return 0;
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Lorsque Visual Studio s’affiche, appuyez F5 sur l’exemple 2 pour exécuter l’exemple 2.

Erreur résultante : opérateur nouveau

Capture d’écran du débogueur affichant l’utilisation d’une erreur de mémoire libérée dans l’exemple 2.

La boîte de dialogue levée d’exception pointe vers la ligne 11, la mémoire tampon[0] = 42, et indique : Address Sanitizer Error : Use of deallocated memory. Non affiché dans la capture d’écran est la sortie dans la fenêtre de console qui affiche les adresses mémoire et une clé permettant d’identifier les octets adressables, les octets partiellement adressables, les régions de tas libérées et le tas gauche des octets de zone rouge alloca dans la zone de l’erreur.

Exemple- realloc

// example3.cpp
// heap-use-after-free error
#include <malloc.h>

int main() {
  char *buffer = (char*)realloc(0, 42);
  free(buffer);

  // ...

  buffer[0] = 42;  // Boom!
  return 0;
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Lorsque Visual Studio s’affiche, appuyez F5 pour exécuter l’exemple 3.

Erreur résultante - realloc

Capture d’écran du débogueur affichant l’utilisation d’une erreur de mémoire libérée dans l’exemple 3.

La boîte de dialogue levée d’exception pointe vers la ligne 11, la mémoire tampon[0] = 42, et indique : Address Sanitizer Error : Use of deallocated memory. Non affiché dans la capture d’écran est la sortie dans la fenêtre de console qui affiche les adresses mémoire et une clé permettant d’identifier les octets adressables, les octets partiellement adressables, les régions de tas libérées et les octets de zone rouge gauche dans la zone de l’erreur.

Exemple : volatile

// example4.cpp
// heap-use-after-free error
#include <stdlib.h>

int main() {

  volatile char *x = (char*)malloc(sizeof(char));
  free((void*)x);

      //...

  *x = 42;        // Boom!
}

Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :

cl example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe

Lorsque Visual Studio s’affiche, appuyez F5 sur l’exemple 4 pour exécuter l’exemple 4.

Erreur résultante - volatile

Capture d’écran du débogueur affichant une utilisation d’une erreur de mémoire libérée dans l’exemple 4.

La boîte de dialogue levée d’exception pointe vers la ligne 12, *x = 42, et indique : Address Sanitizer Error : Use of deallocated memory. Non affiché dans la capture d’écran est la sortie dans la fenêtre de console qui affiche les adresses mémoire et une clé permettant d’identifier les octets adressables, les octets de zone rouge gauche du tas et quelques octets adressables et partiellement adressables dans la zone de l’erreur.

Voir aussi

Vue d’ensemble de AddressSanitizer
Résoudre les problèmes connus liés à AddressSanitizer
Référence de build et de langage AddressSanitizer
Informations de référence sur le runtime AddressSanitizer
Octets d’ombre AddressSanitizer
Test cloud ou distribué AddressSanitizer
Intégration du débogueur AddressSanitizer
Exemples d’erreur AddressSanitizer