Å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.
- De
/RTC
alternativen är inte kompatibla med AddressSanitizer och bör inaktiveras. - Inkrementell länkning stöds inte och bör inaktiveras.
- Redigera och fortsätt stöds inte och bör inaktiveras.
- Coroutines är inte kompatibla med AddressSanitizer och återtagningsbara funktioner är undantagna från instrumentation.
- OpenMP- stöds inte och bör inaktiveras.
- Managed C++ stöds inte och bör inaktiveras.
- C++ AMP- stöds inte och bör inaktiveras.
- UWP-program (Universal Windows Platform) stöds inte.
- specialfallslista filer stöds inte.
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