Condividi tramite


Errore: heap-use-after-free

Errore di purificazione dell'indirizzo: uso della memoria deallocata

Vengono illustrati tre esempi in cui l'archiviazione nell'heap può essere allocata tramite malloc, realloc (C) e new (C++), insieme a un uso errato di volatile.

Esempio- 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!
}

Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:

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

Quando viene visualizzato Visual Studio, premere F5 per eseguire l'esempio 1.

Errore risultante

Screenshot of the debugger displaying use of deallocated memory error for example 1.

L'eccezione generata dalla finestra di dialogo punta alla riga 11, restituisce x [ 5 ], e indica: Address Sanitizer Error Use of deallocated memory.The exception thrown dialog points to line 11, return x [ 5 ], and says: Address Sanitizer Error Use of deallocated memory. Non visualizzato nello screenshot è l'output nella finestra della console che mostra gli indirizzi di memoria e una chiave per identificare byte indirizzabili, byte indirizzabili parzialmente, aree heap liberate e byte di zona rossa sinistra nell'area dell'errore.

Esempio- 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;
}

Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:

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

Quando viene visualizzato Visual Studio, premere F5 per eseguire l'esempio 2.

Errore risultante - operatore new

Screenshot of the debugger displaying use of deallocated memory error in example 2.

L'eccezione generata dalla finestra di dialogo punta alla riga 11, buffer[0] = 42 e indica: Address Sanitizer Error: Use of deallocated memory. Non visualizzato nello screenshot è l'output nella finestra della console che mostra gli indirizzi di memoria e una chiave per identificare byte indirizzabili, byte indirizzabili parzialmente, aree heap liberate e heap a sinistra delle zone rosse alloca nell'area dell'errore.

Esempio- 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;
}

Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:

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

Quando viene visualizzato Visual Studio, premere F5 per eseguire l'esempio 3.

Errore risultante - realloc

Screenshot of the debugger displaying use of deallocated memory error in example 3.

L'eccezione generata dalla finestra di dialogo punta alla riga 11, buffer[0] = 42 e indica: Address Sanitizer Error: Use of deallocated memory. Non visualizzato nello screenshot è l'output nella finestra della console che mostra gli indirizzi di memoria e una chiave per identificare byte indirizzabili, byte indirizzabili parzialmente, aree heap liberate e byte di zona rossa sinistra nell'area dell'errore.

Esempio - 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!
}

Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:

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

Quando viene visualizzato Visual Studio, premere F5 per eseguire l'esempio 4.

Errore risultante - volatile

Screenshot of the debugger displaying a use of deallocated memory error in example 4.

L'eccezione generata dalla finestra di dialogo punta alla riga 12, *x = 42 e indica: Address Sanitizer Error: Use of deallocated memory. Non visualizzato nello screenshot è l'output nella finestra della console che mostra gli indirizzi di memoria e una chiave per identificare i byte indirizzabili, i byte della zona rossa sinistra dell'heap e alcuni byte indirizzabili e parzialmente indirizzabili nell'area dell'errore.

Vedi anche

Panoramica di AddressSanitizer
Problemi noti di AddressSanitizer
Riferimento alla compilazione e al linguaggio AddressSanitizer
Informazioni di riferimento sul runtime AddressSanitizer
Byte ombreggiatura AddressSanitizer
AddressSanitizer cloud o test distribuiti
Integrazione del debugger AddressSanitizer
Esempi di errore addressSanitizer