Problemi noti di AddressSanitizer

Nota

Inviare commenti e suggerimenti su ciò che si vuole visualizzare nelle versioni future e segnalare i bug in caso di problemi.

Opzioni e funzionalità incompatibili

Queste opzioni e funzionalità non sono compatibili con /fsanitize=address e devono essere disabilitate o evitate.

  • Le /RTC opzioni non sono compatibili con AddressSanitizer e devono essere disabilitate.
  • Il collegamento incrementale non è supportato e deve essere disabilitato.
  • Modifica e continuazione non è supportata e deve essere disabilitata.
  • Le coroutine non sono compatibili con AddressSanitizer e le funzioni ripristinabili sono esenti dalla strumentazione.
  • OpenMP non è supportato e deve essere disabilitato.
  • C++ gestito non è supportato e deve essere disabilitato.
  • C++ AMP non è supportato e deve essere disabilitato.
  • le applicazioni piattaforma UWP (Universal Windows Platform) (UWP) non sono supportate.
  • I file di elenco dei casi speciali non sono supportati.
  • MFC che usa l'opzione di runtime facoltativa alloc_dealloc_mismatch non è supportata.

Supporto della libreria standard

La libreria standard MSVC (STL) è parzialmente usata per comprendere AddressSanitizer e fornire altri controlli. Per altre informazioni, vedere Errore di overflow del contenitore.

Quando le annotazioni sono disabilitate o in versioni senza supporto, le eccezioni AddressSanitizer generate nel codice STL identificano comunque bug reali. Tuttavia, non sono così precisi come potrebbero essere.

In questo esempio viene illustrata la mancanza di precisione e i vantaggi dell'abilitazione delle annotazioni:

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

Versioni di Windows

Poiché esistono dipendenze con versioni specifiche di Windows, il supporto è incentrato su Windows 10. MSVC AddressSanitizer è stato testato nella versione 10.0.14393 (RS1) e nella versione 10.0.21323 (build Insider non definitiva). Segnalare un bug se si verificano problemi.

Utilizzo memoria

Il runtime AddressSanitizer non rilascia memoria al sistema operativo durante l'esecuzione. Dal punto di vista del sistema operativo, potrebbe sembrare che ci sia una perdita di memoria. Questa decisione di progettazione è intenzionale, in modo da non allocare tutta la memoria necessaria in anticipo.

Percorsi DLL del runtime AddressSanitizer

I clang_rt.asan*.dll file di runtime vengono installati accanto ai compilatori in %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Questi percorsi si trovano nel percorso nelle sessioni di debug e nei prompt dei comandi per gli sviluppatori di Visual Studio. Questi file non vengono mai inseriti in C:\Windows\System32 o C:\Windows\SysWOW64.

Supporto della finestra delle proprietà personalizzata

La finestra Gestione proprietà nell'IDE di Visual Studio consente di aggiungere file personalizzati .props ai progetti. Anche se viene visualizzata la proprietà Enable Address Sanitizer (<EnableASAN>), la compilazione non lo rispetta. Questo perché i file personalizzati .props vengono inclusi dopo Microsoft.cpp.props, che usa il <EnableASAN> valore per impostare altre proprietà.

Come soluzione alternativa, è possibile creare un Directory.Build.props file nella radice del progetto per definire la <EnableASAN> proprietà . Per altre informazioni, vedere Personalizzare le compilazioni C++.

Vedi anche

Panoramica di AddressSanitizer
Riferimento alla compilazione e al linguaggio AddressSanitizer
Informazioni di riferimento sul runtime AddressSanitizer
Byte ombreggiatura AddressSanitizer
AddressSanitizer cloud o test distribuiti
Integrazione del debugger AddressSanitizer
Esempi di errore addressSanitizer