Sdílet prostřednictvím


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

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

Snímek obrazovky ladicího programu zobrazující použití uvolněné paměti například 1

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

Snímek obrazovky ladicího programu, který zobrazuje chybu uvolněné paměti v příkladu 2

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

Snímek obrazovky ladicího programu zobrazující použití chyby uvolněné paměti v příkladu 3

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á

Snímek obrazovky ladicího programu zobrazující použití chyby uvolněné paměti v příkladu 4

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