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.
- Opsi
/RTC
tidak kompatibel dengan AddressSanitizer dan harus dinonaktifkan. - Penautan inkremental tidak didukung, dan harus dinonaktifkan.
- Edit dan Lanjutkan tidak didukung, dan harus dinonaktifkan.
- Coroutines tidak kompatibel dengan AddressSanitizer, dan fungsi yang dapat dilanjutkan dikecualikan dari instrumentasi.
- OpenMP tidak didukung, dan harus dinonaktifkan.
- C++ terkelola tidak didukung, dan harus dinonaktifkan.
- (C++AMP) tidak didukung, dan harus dinonaktifkan.
- Aplikasi Universal Windows Platform (UWP) tidak didukung.
- File daftar kasus khusus tidak didukung.
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;
}
Mengambil alih operator baru dan menghapus
AddressSanitizer (ASAN) memiliki versi kustom operator new
dan operator delete
yang digunakannya untuk menemukan lebih banyak kesalahan alokasi seperti alloc_dealloc_mismatch
. Menjalankan linker dengan /INFERASANLIBS
memastikan bahwa penimpaan new
/delete
ASAN memiliki prioritas rendah, sehingga linker memilih operator new
atau operator delete
mengambil alih di pustaka lain atas versi kustom ASAN. Ketika ini terjadi, ASAN mungkin tidak dapat menangkap beberapa kesalahan yang bergantung pada operator new
kustom dan operator delete
.
MFC menyertakan penimpaan kustom untuk operator new
dan operator delete
sehingga mungkin melewatkan kesalahan seperti alloc_dealloc_mismatch
.
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++.
Lihat 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