Chyba: heap-use-after-free
Chyba sanitizátoru adresy: Použití uvolněné paměti
Ukážeme si tři příklady, kdy úložiště v haldě lze přidělit prostřednictvím malloc
, (C) a new
(C++) spolu s chybným použitím volatile
realloc
.
Příklad- 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!
}
Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Po zobrazení sady Visual Studio stiskněte a spusťte F5
příklad 1.
Výsledná chyba
Výjimka vyvolaná dialog odkazuje na řádek 11, vrátí x [ 5 ], a říká: Address Sanitizer Error Use of deallocated memory. Na snímku obrazovky se nezobrazuje výstup v okně konzoly, který zobrazuje adresy paměti, a klíč k identifikaci adresovatelných bajtů, částečně adresovatelných bajtů, uvolněných oblastí haldy a bajtů vlevo červené zóny v oblasti chyby.
Příklad- 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;
}
Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
Po zobrazení sady Visual Studio stiskněte a spusťte F5
příklad 2.
Výsledná chyba – operátor new
Výjimka vyvolaná dialog odkazuje na řádek 11, vyrovnávací paměť[0] = 42 a říká: Address Sanitizer Error: Use of deallocated memory. Na snímku obrazovky se nezobrazuje výstup v okně konzoly, který zobrazuje adresy paměti, a klíč k identifikaci adresovatelných bajtů, částečně adresovatelných bajtů, uvolněných oblastí haldy a haldy opustily bajty červené zóny alloca v oblasti chyby.
Příklad- 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;
}
Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:
cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Po zobrazení sady Visual Studio stiskněte a spusťte F5
příklad 3.
Výsledná chyba – realloc
Výjimka vyvolaná dialog odkazuje na řádek 11, vyrovnávací paměť[0] = 42 a říká: Address Sanitizer Error: Use of deallocated memory. Na snímku obrazovky se nezobrazuje výstup v okně konzoly, který zobrazuje adresy paměti, a klíč k identifikaci adresovatelných bajtů, částečně adresovatelných bajtů, uvolněných oblastí haldy a bajtů vlevo červené zóny v oblasti chyby.
Příklad – nestálá
// 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!
}
Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:
cl example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe
Po zobrazení sady Visual Studio stiskněte a spusťte F5
příklad 4.
Výsledná chyba – nestálá
Výjimka vyvolaná dialog odkazuje na řádek 12, *x = 42 a říká: Address Sanitizer Error: Use of deallocated memory. Na snímku obrazovky se nezobrazuje výstup v okně konzoly, který zobrazuje adresy paměti, a klíč pro identifikaci adresovatelných bajtů, bajty levé červené zóny haldy a některé adresovatelné a částečně adresovatelné bajty v oblasti chyby.
Viz také
Přehled AddressSanitizer
Známé problémy s addressSanitizerem
Referenční dokumentace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
AddressSanitizer – cloud nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer