Aracılığıyla paylaş


Hata: heap-use-after-free

Adres Temizleme Hatası: Serbest bırakılmış bellek kullanımı

Yığındaki depolamanın , realloc (C) ve new (C++) aracılığıyla mallocve yanlış kullanımıyla volatileayrılabileceği üç örnek gösteririz.

Örnek- 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!
}

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

Visual Studio görüntülendiğinde örnek 1'i çalıştırmak için basın F5 .

Sonuçta oluşan hata

Serbest bırakılmış bellek kullanımının görüntülendiği hata ayıklayıcının ekran görüntüsü, örneğin 1.

Oluşturulan özel durum iletişim kutusu 11. satıra işaret ederek x [ 5 ] döndürür ve şunu söyler: Adres Dezenfektanı Serbest bırakılmış bellek kullanımı hatası. Ekran görüntüsünde, konsol penceresinde bellek adreslerini gösteren çıkış ve adreslenebilir baytları, kısmen adreslenebilir baytları, serbest bırakılmış yığın bölgelerini ve hata alanındaki yığın sol kırmızı bölge baytlarını tanımlamaya yönelik bir anahtar gösterilir.

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

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

Visual Studio görüntülendiğinde, örnek 2'yi çalıştırmak için basın F5 .

Sonuç hatası - işleç yeni

Örnek 2'de serbest bırakılmış bellek hatasının kullanımını görüntüleyen hata ayıklayıcının ekran görüntüsü.

Oluşturulan özel durum, 11. satıra, arabellek[0] = 42'ye işaret etti ve şunu söylüyor: Adres Dezenfektanı Hatası: Serbest bırakılmış bellek kullanımı. Ekran görüntüsünde, konsol penceresinde bellek adreslerini gösteren çıkış ve adreslenebilir baytları, kısmen adreslenebilir baytları, serbest bırakılmış yığın bölgelerini ve hata alanında alloca kırmızı bölge baytlarını bırakan bir anahtar gösterilir.

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

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

Visual Studio görüntülendiğinde örnek 3'e basmak için basın F5 .

Sonuçta oluşan hata - yeniden ayırma

Örnek 3'te serbest bırakılmış bellek hatasının kullanımını görüntüleyen hata ayıklayıcının ekran görüntüsü.

Oluşturulan özel durum, 11. satıra, arabellek[0] = 42'ye işaret etti ve şunu söylüyor: Adres Dezenfektanı Hatası: Serbest bırakılmış bellek kullanımı. Ekran görüntüsünde, konsol penceresinde bellek adreslerini gösteren çıkış ve adreslenebilir baytları, kısmen adreslenebilir baytları, serbest bırakılmış yığın bölgelerini ve hata alanındaki yığın sol kırmızı bölge baytlarını tanımlamaya yönelik bir anahtar gösterilir.

Örnek - geçici

// 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!
}

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 example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe

Visual Studio görüntülendiğinde 4. örneği çalıştırmak için basın F5 .

Sonuçta oluşan hata - geçici

Örnek 4'te serbest bırakılmış bellek hatasının kullanımını görüntüleyen hata ayıklayıcının ekran görüntüsü.

Oluşturulan özel durum iletişim kutusu 12. satıra ,*x = 42'ye işaret etti ve diyor ki: Adres Dezenfektanı Hatası: Serbest bırakılmış bellek kullanımı. Ekran görüntüsünde, konsol penceresinde bellek adreslerini gösteren çıkış ve adreslenebilir baytları, yığın sol kırmızı bölge baytlarını ve hata alanındaki bazı adreslenebilir ve kısmen adreslenebilir baytları tanımlamaya yönelik bir anahtar gösterilir.

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