Błąd: double-free
Błąd rozwiązania Sanitizer: cofnięcie przydziału zwolnionej pamięci
W języku C można wywołać free
błędnie. W języku C++można wywołać delete
więcej niż raz. W tych przykładach pokazano błędy z parametrami delete
, free
i HeapCreate
.
Przykładowy kod C++ — podwójne operator delete
// example1.cpp
// double-free error
int main() {
int *x = new int[42];
delete [] x;
// ... some complex body of code
delete [] x;
return 0;
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia dewelopera Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Wynikowy błąd — dwukrotnie operator delete
Przykład "C" — podwójna free
// example2.cpp
// double-free error
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
char* x = (char*)malloc(10 * sizeof(char));
memset(x, 0, 10);
int res = x[argc];
free(x);
// ... some complex body of code
free(x + argc - 1); // Boom!
return res;
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia dewelopera Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe
Wynikowy błąd — dwukrotnie free
Przykład — Windows HeapCreate
dwukrotnieHeapFree
// example3.cpp
// double-free error
#include <Windows.h>
#include <stdio.h>
int main() {
void* newHeap = HeapCreate(0, 0, 0);
void* newAlloc = HeapAlloc(newHeap, 0, 100);
HeapFree(newHeap, 0, newAlloc);
HeapFree(newHeap, 0, newAlloc);
printf("failure\n");
return 1;
}
Aby skompilować i przetestować ten przykład, uruchom następujące polecenia w wierszu polecenia dewelopera Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Błąd wynikowy — Windows HeapCreate
dwukrotnieHeapFree
Zobacz też
Omówienie narzędzia AddressSanitizer
Rozwiązywanie znanych problemów z rozwiązaniemSanitizer
Dokumentacja języka i kompilacji narzędzia AddressSanitizer
AddressSanitizer runtime reference (Dokumentacja środowiska uruchomieniowego narzędzia AddressSanitizer)
Bajty cienia addressSanitizer
AddressSanitizer cloud or distributed testing (Testowanie rozproszone lub chmura AddressSanitizer)
Integracja debugera AddressSanitizer
Przykłady błędów narzędzia AddressSanitizer