Rozwiązywanie znanych problemów z programemSanitizer
Uwaga
Wyślij nam opinię na temat tego, co chcesz zobaczyć w przyszłych wersjach, i zgłoś usterki , jeśli wystąpią problemy.
Niezgodne opcje i funkcje
Te opcje i funkcje są niezgodne z /fsanitize=address
i powinny być wyłączone lub unikane.
- Opcje
/RTC
są niezgodne z narzędziem AddressSanitizer i powinny być wyłączone. - Łączenie przyrostowe jest nieobsługiwane i powinno być wyłączone.
- Opcja Edytuj i kontynuuj nie jest obsługiwana i powinna być wyłączona.
- Kohroutines są niezgodne z AddressSanitizer, a funkcje możliwe do wznowienia są wykluczone z instrumentacji.
- Protokół OpenMP jest nieobsługiwany i powinien być wyłączony.
- Zarządzany język C++ jest nieobsługiwany i powinien być wyłączony.
- Język C++ AMP jest nieobsługiwany i powinien być wyłączony.
- aplikacje platformy platforma uniwersalna systemu Windows (UWP) nie są obsługiwane.
- Pliki listy przypadków specjalnych nie są obsługiwane.
- Usługa MFC korzystająca z opcjonalnej
alloc_dealloc_mismatch
opcji środowiska uruchomieniowego nie jest obsługiwana.
Obsługa standardowej biblioteki
Biblioteka standardowa MSVC (STL) jest częściowo oświecona, aby zrozumieć element AddressSanitizer i zapewnić inne kontrole. Aby uzyskać więcej informacji, zobacz błąd przepełnienia kontenera.
Jeśli adnotacje są wyłączone lub w wersjach bez obsługi, wyjątki AddressSanitizer zgłoszone w kodzie STL nadal identyfikują prawdziwe błędy. Jednak nie są one tak precyzyjne, jak to możliwe.
W tym przykładzie pokazano brak dokładności i korzyści z włączania adnotacji:
// 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;
}
Wersje systemu Windows
Ponieważ istnieją zależności z określonymi wersjami systemu Windows, obsługa koncentruje się na systemie Windows 10. Program MSVC AddressSanitizer został przetestowany w wersji 10.0.14393 (RS1) i 10.0.21323 (kompilacja testów wstępnych). Zgłoś usterkę , jeśli wystąpią problemy.
Użycie pamięci
Środowisko uruchomieniowe AddressSanitizer nie zwalnia pamięci z powrotem do systemu operacyjnego podczas wykonywania. Z punktu widzenia systemu operacyjnego może to wyglądać tak, jakby wystąpił wyciek pamięci. Ta decyzja projektowa jest celowa, aby nie przydzielić z góry całej wymaganej pamięci.
AddressSanitizer runtime DLL locations (Lokalizacje bibliotek DLL środowiska uruchomieniowego AddressSanitizer)
Pliki clang_rt.asan*.dll
środowiska uruchomieniowego są instalowane obok kompilatorów w programie %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\
. Te lokalizacje znajdują się na ścieżce w sesjach debugowania i w wierszach polecenia dla deweloperów programu Visual Studio. Te pliki nigdy nie są umieszczane w pliku C:\Windows\System32
lub C:\Windows\SysWOW64
.
Obsługa niestandardowego arkusza właściwości
Okno Menedżer właściwości w środowisku IDE programu Visual Studio umożliwia dodawanie plików niestandardowych .props
do projektów. Mimo że jest wyświetlana właściwość Enable Address Sanitizer (<EnableASAN>
), kompilacja nie honoruje jej. Dzieje się tak, ponieważ pliki niestandardowe .props
są dołączane po Microsoft.cpp.props
elemecie <EnableASAN>
, który używa wartości do ustawiania innych właściwości.
Aby obejść ten problem, możesz utworzyć Directory.Build.props
plik w katalogu głównym projektu w celu zdefiniowania <EnableASAN>
właściwości. Aby uzyskać więcej informacji, zobacz Dostosowywanie kompilacji języka C++.
Zobacz też
AddressSanitizer — omówienie
Dokumentacja języka i kompilacji narzędzia AddressSanitizer
AddressSanitizer runtime reference (Dokumentacja środowiska uruchomieniowego AddressSanitizer)
Bajty w tle addressSanitizer
AddressSanitizer — chmura lub testowanie rozproszone
Integracja debugera AddressSanitizer
Przykłady błędów addressSanitizer