Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 berikut 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.
-
Header yang telah dikompilasi yang dibuat tanpa
/fsanitize
alamat' tidak didukung.
Dukungan pustaka standar
Pustaka standar MSVC (STL) menggunakan sebagian AddressSanitizer dan memberikan pemeriksaan keamanan kode lainnya. Untuk informasi selengkapnya, lihat kesalahan container-overflow.
Saat anotasi dinonaktifkan, atau dalam versi Pustaka Standar yang tidak mendukungnya, pengecualian AddressSanitizer yang dimunculkan dalam kode STL masih mengidentifikasi bug nyata. Namun, anotasi lebih tepat jika anotasi diaktifkan dan Anda menggunakan versi Pustaka Standar yang mendukungnya.
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) menggunakan versi operator new
kustom dan operator delete
untuk menemukan kesalahan alokasi seperti alloc_dealloc_mismatch
. Menjalankan linker dengan /INFERASANLIBS
memastikan bahwa penimpaan ASan new
/delete
memiliki prioritas rendah, sehingga linker memilih salah satu 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 kustomnya operator new
dan operator delete
.
MFC menyertakan penimpaan kustom untuk operator new
dan operator delete
dan mungkin melewatkan kesalahan seperti alloc_dealloc_mismatch
.
Penggunaan memori
Runtime AddressSanitizer tidak merilis memori kembali ke OS selama eksekusi sehingga memori tidak semuanya dialokasikan di depan. Dari sudut pandang OS, mungkin terlihat seperti ada kebocoran memori.
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 Manajer Properti Visual Studio memungkinkan Anda menambahkan file kustom .props
ke proyek Anda. Meskipun properti Aktifkan Address Sanitizer (<EnableASAN>
) ditampilkan, build tidak menghormatinya. Build tidak menghormatinya karena file kustom .props
disertakan setelah Microsoft.cpp.props
, yang menggunakan <EnableASAN>
nilai untuk mengatur properti lain.
Sebagai solusinya, buat Directory.Build.props
file di akar proyek Anda untuk menentukan <EnableASAN>
properti . Untuk informasi selengkapnya, lihat Menyesuaikan build C++.
Variabel lokal utas
Variabel lokal utas (variabel global yang dideklarasikan dengan __declspec(thread)
atau thread_local
) tidak dilindungi oleh AddressSanitizer. Batasan ini tidak khusus untuk Windows atau Microsoft Visual C++, tetapi merupakan batasan umum.
Kode kustom melewati urutan pengembalian fungsi normal
Menggunakan kode kustom atau bahasa assembly untuk meninggalkan bingkai tumpukan saat ini tanpa mematuhi mekanisme pengembalian yang biasa tidak didukung. Misalnya, meninggalkan bingkai tumpukan saat ini melalui lompatan panjang dapat menghasilkan positif palsu.
Sebagai gantinya, sebelum memanggil kode seperti lompatan panjang kustom, panggil __asan_handle_no_return()
. Fungsi ini menghapus semua byte bayangan yang terkait dengan tumpukan utas saat ini, yang menghasilkan beberapa cakupan yang hilang dan memperkenalkan risiko negatif palsu. Tetapi program Anda kemudian dapat dengan aman melepas tumpukan tanpa mengalami positif palsu karena byte bayangan tumpukan basi.
Masalah dengan executable yang dibersikan sebagian
Jika semua kode dalam proses tidak dikompilasi dengan /fsanitize=address
, ASan mungkin tidak dapat mendiagnosis semua kesalahan keamanan memori. Contoh yang paling umum adalah ketika DLL yang dikompilasi dengan ASan dimuat ke dalam proses yang berisi kode yang tidak dikompilasi dengan ASan. Dalam hal ini, ASan mencoba mengategorikan alokasi yang terjadi sebelum inisialisasi ASan. Setelah alokasi tersebut direalokasikan, ASan mencoba memiliki dan memantau masa pakai memori.
Jika semua DLL yang dikompilasi dengan ASan dibongkar dari proses sebelum proses berakhir, mungkin ada crash karena referensi menggantung ke fungsi yang disadap seperti memcmp
, , memcpy
memmove
, dan sebagainya. Untuk hasil terbaik, kompilasi semua modul di bawah pengujian dengan /fsanitize=address
, atau jangan bongkar modul yang dikompilasi dengan ASan setelah mereka memasuki proses.
Harap laporkan bug apa pun ke Komunitas Pengembang kami.
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