Udostępnij za pośrednictwem


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.

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.propselemecie <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