Bagikan melalui


Masalah AddressSanitizer yang diketahui

Catatan

Kirimi kami umpan balik tentang apa yang ingin Anda lihat di rilis mendatang, dan laporkan bug jika Anda mengalami masalah.

Opsi dan fungsionalitas yang tidak kompatibel

Opsi dan fungsionalitas ini tidak kompatibel dengan /fsanitize=address dan harus dinonaktifkan atau dihindari.

Dukungan pustaka standar

Pustaka standar MSVC (STL) sebagian tercerahkan untuk memahami AddressSanitizer dan memberikan pemeriksaan lainnya. Untuk informasi selengkapnya, lihat kesalahan container-overflow.

Ketika anotasi dinonaktifkan atau dalam versi tanpa dukungan, pengecualian AddressSanitizer yang dimunculkan dalam kode STL masih mengidentifikasi bug sejati. Namun, mereka tidak setepat yang mereka bisa.

Contoh ini menunjukkan kurangnya presisi dan manfaat mengaktifkan anotasi:

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

Versi Windows

Karena ada dependensi dengan versi Windows tertentu, dukungan difokuskan pada Windows 10. MSVC AddressSanitizer diuji pada 10.0.14393 (RS1), dan 10.0.21323 (build insider prarilis). Laporkan bug jika Anda mengalami masalah.

Penggunaan memori

Runtime AddressSanitizer tidak merilis memori kembali ke OS selama eksekusi. Dari sudut pandang OS, mungkin terlihat seperti ada kebocoran memori. Keputusan desain ini disengaja, agar tidak mengalokasikan semua memori yang diperlukan di muka.

Lokasi DLL runtime AddressSanitizer

File clang_rt.asan*.dll runtime diinstal di samping pengkompilasi di %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Lokasi ini berada di jalur dalam sesi penelusuran kesalahan, dan di perintah pengembang Visual Studio. File-file ini tidak pernah ditempatkan di C:\Windows\System32 atau C:\Windows\SysWOW64.

Dukungan lembar properti kustom

Jendela Pengelola Properti di Visual Studio IDE memungkinkan Anda menambahkan file kustom .props ke proyek Anda. Meskipun properti Aktifkan Address Sanitizer (<EnableASAN>) ditampilkan, build tidak menghormatinya. Itu karena file kustom .props disertakan setelah Microsoft.cpp.props, yang menggunakan <EnableASAN> nilai untuk mengatur properti lain.

Sebagai solusinya, Anda dapat membuat Directory.Build.props file di akar proyek Anda untuk menentukan <EnableASAN> properti . Untuk informasi selengkapnya, lihat Menyesuaikan build C++.

Baca juga

Gambaran umum AddressSanitizer
Referensi bahasa dan build AddressSanitizer
Referensi runtime AddressSanitizer
Byte bayangan AddressSanitizer
AddressSanitizer cloud atau pengujian terdistribusi
Integrasi debugger AddressSanitizer
Contoh kesalahan AddressSanitizer