Bagikan melalui


Masalah dan batasan 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 berikut tidak kompatibel dengan /fsanitize=address dan harus dinonaktifkan atau dihindari.

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, , memcpymemmove, 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