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 malloc
ve yanlış kullanımıyla volatile
ayrı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
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
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
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
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