Partager via


Problèmes connus d’AddressSanitizer

Remarque

Envoyez-nous des commentaires sur ce que vous souhaitez voir dans les versions ultérieures et signalez des bogues si vous rencontrez des problèmes.

Options et fonctionnalités incompatibles

Ces options et fonctionnalités sont incompatibles avec /fsanitize=address et doivent être désactivées ou évitées.

  • Les options /RTC ne sont pas compatibles avec AddressSanitizer et doivent être désactivées.
  • La liaison incrémentielle n’est pas prise en charge et doit être désactivée.
  • Modifier et continuer n’est pas pris en charge et doit être désactivé.
  • Les coroutines ne sont pas compatibles avec AddressSanitizer et les fonctions pouvant être reprises sont exemptées de l’instrumentation.
  • OpenMP n’est pas pris en charge et doit être désactivé.
  • Managed C++ n’est pas pris en charge et doit être désactivé.
  • (C++ AMP) n’est pas pris en charge et doit être désactivé.
  • Les applications de la plateforme Windows universelle (UWP) ne sont pas prises en charge.
  • Les fichiers de la liste des cas spéciaux ne sont pas pris en charge.
  • MFC utilisant l’option runtime facultative alloc_dealloc_mismatch n’est pas prise en charge.

Prise en charge de la bibliothèque standard

La bibliothèque standard MSVC (STL) est partiellement éclairée pour comprendre l’AddressSanitizer et fournir d’autres vérifications. Pour plus d’informations, consultez l’erreur de dépassement de capacité du conteneur.

Lorsque les annotations sont désactivées ou dans les versions sans prise en charge, les exceptions AddressSanitizer déclenchées dans le code STL identifient toujours les vrais bogues. Cependant, elles ne sont pas aussi précises que possible.

Cet exemple illustre le manque de précision et les avantages de l’activation des annotations :

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

Versions de Windows

Comme il existe des dépendances avec des versions Spécifiques de Windows, la prise en charge est axée sur Windows 10. MsVC AddressSanitizer a été testé sur 10.0.14393 (RS1) et 10.0.21323 (build insider prerelease). Signalez un bogue si vous rencontrez des problèmes.

Utilisation de la mémoire

Le runtime AddressSanitizer ne libère pas de mémoire sur le système d’exploitation pendant l’exécution. Du point de vue du système d’exploitation, il peut ressembler à une fuite de mémoire. Cette décision de conception est intentionnelle, afin de ne pas allouer toutes les mémoires requises à l’avant.

Emplacements DLL du runtime AddressSanitizer

Les clang_rt.asan*.dll fichiers runtime sont installés en regard des compilateurs dans %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Ces emplacements se trouvent sur le chemin d’accès dans les sessions de débogage et dans les invites de commandes du développeur Visual Studio. Ces fichiers ne sont jamais placés ou C:\Windows\System32 C:\Windows\SysWOW64.

Prise en charge de la feuille de propriétés personnalisée

La fenêtre Gestionnaire de propriétés dans l’IDE Visual Studio vous permet d’ajouter des fichiers personnalisés .props à vos projets. Même si la propriété Enable Address Sanitizer (<EnableASAN>) est affichée, la build ne l’honore pas. Cela est dû au fait que les fichiers personnalisés .props sont inclus après Microsoft.cpp.props, qui utilise la <EnableASAN> valeur pour définir d’autres propriétés.

Pour contourner ce problème, vous pouvez créer un Directory.Build.props fichier à la racine de votre projet pour définir la <EnableASAN> propriété. Pour plus d’informations, consultez Personnaliser les builds C++.

Voir aussi

Vue d’ensemble de AddressSanitizer
Référence de build et de langage AddressSanitizer
Informations de référence sur le runtime AddressSanitizer
Octets d’ombre AddressSanitizer
Test cloud ou distribué AddressSanitizer
Intégration du débogueur AddressSanitizer
Exemples d’erreur AddressSanitizer