Hata: double-free

Adres Temizleme Hatası: Serbest bırakılmış belleğin serbest bırakılması

C'de, hatalı bir şekilde çağırabilirsiniz free . C++'ta birden çok kez çağrı delete yapabilirsiniz. Bu örneklerde , freeve HeapCreateile deleteilgili hatalar göstereceğiz.

Örnek C++ - çift 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;
}

Bu örneği derlemek ve test etmek için visual studio 2019 sürüm 16.9 veya sonraki bir geliştirici komut isteminde şu komutları çalıştırın:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Sonuçta oluşan hata - çift operator delete

Örnek 1'de çift ücretsiz hata görüntüleyen hata ayıklayıcının ekran görüntüsü.

Örnek 'C' - double 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;
}

Bu örneği derlemek ve test etmek için visual studio 2019 sürüm 16.9 veya sonraki bir geliştirici komut isteminde şu komutları çalıştırın:

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Sonuçta oluşan hata - çift free

Örnek 2'de çift ücretsiz hata görüntüleyen hata ayıklayıcının ekran görüntüsü.

Örnek - Windows HeapCreate çift 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;
}

Bu örneği derlemek ve test etmek için visual studio 2019 sürüm 16.9 veya sonraki bir geliştirici komut isteminde şu komutları çalıştırın:

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Sonuç hatası - Windows HeapCreate çift HeapFree

Örnek 3'te çift ücretsiz hata görüntüleyen hata ayıklayıcının ekran görüntüsü.

Ayrıca bkz.

AddressSanitizer'a genel bakış
AddressSanitizer bilinen sorunları
AddressSanitizer derlemesi ve dil başvurusu
AddressSanitizer çalışma zamanı başvurusu
AddressSanitizer gölge baytları
AddressSanitizer bulut veya dağıtılmış test
AddressSanitizer hata ayıklayıcısı tümleştirmesi
AddressSanitizer hata örnekleri