Delen via


Bekende problemen met AddressSanitizer

Notitie

Stuur ons feedback over wat u in toekomstige releases wilt zien en fouten melden als u problemen ondervindt.

Incompatibele opties en functionaliteit

Deze opties en functionaliteit zijn niet compatibel met /fsanitize=address en moeten worden uitgeschakeld of vermeden.

Standaardbibliotheekondersteuning

De MSVC-standaardbibliotheek (STL) is gedeeltelijk verlicht om inzicht te hebben in de AddressSanitizer en andere controles te bieden. Zie container-overloopfoutvoor meer informatie.

Wanneer aantekeningen zijn uitgeschakeld of in versies zonder ondersteuning, worden adresSanitizer-uitzonderingen die in STL-code worden gegenereerd, nog steeds echte fouten geïdentificeerd. Ze zijn echter niet zo nauwkeurig als ze zouden kunnen zijn.

In dit voorbeeld ziet u het gebrek aan precisie en de voordelen van het inschakelen van aantekeningen:

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

Windows-versies

Omdat er afhankelijkheden zijn met specifieke Windows-versies, is ondersteuning gericht op Windows 10. MSVC AddressSanitizer is getest op 10.0.14393 (RS1) en 10.0.21323 (prerelease insider build). een fout melden als u problemen ondervindt.

Geheugengebruik

De AddressSanitizer-runtime brengt tijdens de uitvoering geen geheugen vrij aan het besturingssysteem. Vanuit het oogpunt van het besturingssysteem kan het lijken alsof er een geheugenlek is. Deze ontwerpbeslissing is opzettelijk, zodat niet alle vereiste geheugen vooraf moet worden toegewezen.

DLL-locaties van AddressSanitizer-runtime

De clang_rt.asan*.dll runtimebestanden worden geïnstalleerd naast de compilers in %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Deze locaties bevinden zich op het pad in foutopsporingssessies en in opdrachtprompts van Visual Studio-ontwikkelaars. Deze bestanden worden nooit in C:\Windows\System32 of C:\Windows\SysWOW64geplaatst.

Ondersteuning voor aangepast eigenschappenvenster

Met het venster Property Manager in Visual Studio IDE kunt u aangepaste .props-bestanden toevoegen aan uw projecten. Hoewel de eigenschap Adres opschoning inschakelen (<EnableASAN>) wordt weergegeven, wordt deze niet door de build gehonoreerd. Dat komt doordat de aangepaste .props-bestanden worden opgenomen na Microsoft.cpp.props, die de <EnableASAN>-waarde gebruikt om andere eigenschappen in te stellen.

Als tijdelijke oplossing kunt u een Directory.Build.props-bestand maken in de hoofdmap van uw project om de eigenschap <EnableASAN> te definiëren. Zie C++-builds aanpassenvoor meer informatie.

Zie ook

Overzicht van AddressSanitizer
AddressSanitizer-build- en taalreferenties
naslaginformatie over AddressSanitizer-runtime
addressSanitizer schaduwbytes
AddressSanitizer-cloud of gedistribueerde tests
integratie van AddressSanitizer-foutopsporingsprogramma's
voorbeelden van AddressSanitizer-fouten