Aracılığıyla paylaş


AddressSanitizer bilinen sorunları

Dekont

Gelecek sürümlerde görmek istediklerinizi bize geri bildirim gönderin ve sorunlarla karşılaşırsanız hataları bildirin.

Uyumsuz seçenekler ve işlevler

Bu seçenekler ve işlevler ile /fsanitize=address uyumlu değildir ve devre dışı bırakılmalı veya önlenmelidir.

  • Seçenekler /RTC AddressSanitizer ile uyumsuz ve devre dışı bırakılmalıdır.
  • Artımlı bağlama desteklenmiyor ve devre dışı bırakılmalıdır.
  • Düzenle ve Devam Et desteklenmez ve devre dışı bırakılmalıdır.
  • Eş yordamlar AddressSanitizer ile uyumsuz ve devam ettirilebilen işlevler izlemeden muaf tutulur.
  • OpenMP desteklenmiyor ve devre dışı bırakılmalıdır.
  • Yönetilen C++ desteklenmez ve devre dışı bırakılmalıdır.
  • C++ AMP desteklenmez ve devre dışı bırakılmalıdır.
  • Evrensel Windows Platformu (UWP) uygulamaları desteklenmez.
  • Özel durum listesi dosyaları desteklenmiyor.
  • İsteğe bağlı alloc_dealloc_mismatch çalışma zamanı seçeneğini kullanan MFC desteklenmez.

Standart kitaplık desteği

MSVC standart kitaplığı (STL), AddressSanitizer'ı anlamak ve diğer denetimleri sağlamak için kısmen aydınlatılır. Daha fazla bilgi için bkz . kapsayıcı taşması hatası.

Ek açıklamalar devre dışı bırakıldığında veya desteği olmayan sürümlerde, STL kodunda tetiklenen AddressSanitizer özel durumları yine de gerçek hataları tanımlar. Ancak, bunlar olabildiğince kesin değildir.

Bu örnek duyarlık eksikliğini ve ek açıklamaları etkinleştirmenin avantajlarını gösterir:

// Compile with: cl /fsanitize=address /Zi
#include <vector>

int main() {   
    // Create a vector of size 10, but with a capacity of 20.    
    std::vector<int> v(10);
    v.reserve(20);

    // In versions prior to 17.2, MSVC ASan does NOT raise an exception here.
    // While this is an out-of-bounds write to 'v', MSVC ASan
    // ensures the write is within the heap allocation size (20).
    // With 17.2 and later, MSVC ASan will raise a 'container-overflow' exception:
    // ==18364==ERROR: AddressSanitizer: container-overflow on address 0x1263cb8a0048 at pc 0x7ff6466411ab bp 0x005cf81ef7b0 sp 0x005cf81ef7b8
    v[10] = 1;

    // Regardless of version, MSVC ASan DOES raise an exception here, as this write
    // is out of bounds from the heap allocation.
    v[20] = 1;
}

Windows sürümleri

Belirli Windows sürümlerine yönelik bağımlılıklar olduğundan, destek Windows 10'a odaklanmıştır. MSVC AddressSanitizer 10.0.14393 (RS1) ve 10.0.21323 (insider derlemesi öncesi) üzerinde test edilmiştir. Sorunlarla karşılaşırsanız bir hata bildirin.

Bellek kullanımı

AddressSanitizer çalışma zamanı yürütme sırasında belleği işletim sistemine geri bırakmaz. İşletim sistemi açısından bakıldığında bellek sızıntısı var gibi görünebilir. Bu tasarım kararı, gerekli tüm belleği önceden ayırmamak için kasıtlı olarak yapılır.

AddressSanitizer çalışma zamanı DLL konumları

Çalışma clang_rt.asan*.dll zamanı dosyaları içindeki %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\derleyicilerin yanına yüklenir. Bu konumlar hata ayıklama oturumlarındaki yolda ve Visual Studio geliştirici komut istemlerinde bulunur. Bu dosyalar hiçbir zaman veya C:\Windows\SysWOW64içine C:\Windows\System32 yerleştirilmedi.

Özel özellik sayfası desteği

Visual Studio IDE'deki Özellik Yöneticisi penceresi, projelerinize özel .props dosyalar eklemenize olanak tanır. Adres Temizlemeyi Etkinleştir özelliği (<EnableASAN>) gösteriliyor olsa da, derleme bunu kabul etmez. Bunun nedeni, diğer özellikleri ayarlamak için değerini kullanan <EnableASAN> özel .props dosyaların sonrasına dahil Microsoft.cpp.propsolmasıdır.

Geçici bir çözüm olarak, özelliğini tanımlamak <EnableASAN> için projenizin kökünde bir Directory.Build.props dosya oluşturabilirsiniz. Daha fazla bilgi için bkz . C++ derlemelerini özelleştirme.

Ayrıca bkz.

AddressSanitizer'a genel bakış
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