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