Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Błąd:
Błąd sanitizera adresu: 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 programu 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ójne 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 programu 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 — Podwójne okna HeapCreate
HeapFree
// 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 programu Visual Studio 2019 w wersji 16.9 lub nowszej:
cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Błąd wynikowy — dwukrotnie system Windows HeapCreate
HeapFree
Zobacz też
AddressSanitizer — omówienie
Rozwiązywanie znanych problemów z programemSanitizer
Dokumentacja języka i kompilacji narzędzia AddressSanitizer
AddressSanitizer runtime reference (Dokumentacja środowiska uruchomieniowego AddressSanitizer)
Bajty w tle addressSanitizer
AddressSanitizer — chmura lub testowanie rozproszone
Integracja debugera AddressSanitizer
Przykłady błędów addressSanitizer