Dela via


Åtgärda Kända problem med Sanitizer

Not

Skicka oss feedback om vad du vill se i framtida versioner och rapportera buggar om du stöter på problem.

Inkompatibla alternativ och funktioner

Dessa alternativ och funktioner är inte kompatibla med /fsanitize=address och bör inaktiveras eller undvikas.

Stöd för standardbibliotek

MSVC-standardbiblioteket (STL) är delvis upplyst för att förstå AddressSanitizer och tillhandahålla andra kontroller. Mer information finns i container-overflow-fel.

När anteckningar är inaktiverade eller i versioner utan stöd identifierar AddressSanitizer-undantag som genereras i STL-kod fortfarande sanna buggar. De är dock inte så exakta som de kan vara.

Det här exemplet visar bristen på precision och fördelarna med att aktivera anteckningar:

// 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;
}

Åsidosättande operator ny och ta bort

AddressSanitizer (ASAN) har en anpassad version av operator new och operator delete som används för att hitta fler allokeringsfel som alloc_dealloc_mismatch. Om du kör länkaren med /INFERASANLIBS ser du till att ASAN:s new/delete åsidosättning har låg prioritet, så att länkaren väljer alla operator new eller operator delete åsidosättningar i andra bibliotek framför ASAN:s anpassade versioner. När detta händer kanske ASAN inte kan fånga upp några fel som förlitar sig på dess anpassade operator new och operator delete.

MFC- innehåller anpassade åsidosättningar för operator new och operator delete och kan därför missa fel som alloc_dealloc_mismatch.

Windows-versioner

Eftersom det finns beroenden med specifika Windows-versioner fokuserar stödet på Windows 10. MSVC AddressSanitizer testades på 10.0.14393 (RS1) och 10.0.21323 (förhandsversion insider build). Rapportera en bugg om du stöter på problem.

Minnesanvändning

AddressSanitizer-körningen frigör inte minne tillbaka till operativsystemet under körningen. Ur operativsystemets synvinkel kan det se ut som om det finns en minnesläcka. Det här designbeslutet är avsiktligt för att inte allokera allt nödvändigt minne i förväg.

AddressSanitizer runtime DLL-platser

De clang_rt.asan*.dll runtime-filerna installeras bredvid kompilatorerna i %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Dessa platser är på sökvägen i felsökningssessioner och i Kommandotolken för Visual Studio-utvecklare. Dessa filer placeras aldrig i C:\Windows\System32 eller C:\Windows\SysWOW64.

Stöd för anpassad egenskapssida

Med fönstret Property Manager i Visual Studio IDE kan du lägga till anpassade .props filer i dina projekt. Även om egenskapen Enable Address Sanitizer (<EnableASAN>) visas, respekterar inte bygget den. Det beror på att de anpassade .props-filerna inkluderas efter Microsoft.cpp.props, som använder värdet <EnableASAN> för att ange andra egenskaper.

Som en lösning kan du skapa en Directory.Build.props fil i roten för projektet för att definiera egenskapen <EnableASAN>. Mer information finns i Anpassa C++-versioner.

Se även

AddressSanitizer– översikt
AddressSanitizer build and language reference
AddressSanitizer-körningsreferens
AddressSanitizer skugg byte
AddressSanitizer-moln eller distribuerad testning
AddressSanitizer-felsökningsintegrering
AddressSanitizer-felexempel