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

Screenshot of debugger displaying double-free error in example 1.

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

Screenshot of debugger displaying double-free error in example 2.

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

Screenshot of debugger displaying double-free error in example 3.

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