Partilhar via


Problemas conhecidos do AddressSanitizer

Observação

Envie seus comentários sobre o que gostaria de ver em versões futuras, e relate bugs se você encontrar problemas.

Opções e funcionalidades incompatíveis

Essas opções e funcionalidades são incompatíveis com /fsanitize=address e devem ser desabilitadas ou evitadas.

Suporte à biblioteca padrão

A STL (biblioteca padrão) do MSVC é parcialmente habilitada para entender o AddressSanitizer e fornecer outras verificações. Para obter mais informações, consulte Erro de estouro de contêiner.

Quando as anotações são desabilitadas ou em versões sem suporte, as exceções do AddressSanitizer geradas no código STL ainda identificam bugs verdadeiros. No entanto, elas não são tão precisas quanto poderiam ser.

Este exemplo demonstra a falta de precisão e os benefícios de habilitar anotações:

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

Versões do Windows

Como há dependências com versões específicas do Windows, o suporte está focado em Windows 10. O MSVC AddressSanitizer foi testado em 10.0.14393 (RS1) e 10.0.21323 (build interno de pré-lançamento). Relate um bug se você tiver problemas.

Uso de memória

O runtime do AddressSanitizer não libera memória de volta para o sistema operacional durante a execução. Do ponto de vista do sistema operacional, pode parecer que há um vazamento de memória. Essa decisão de design é intencional, para não alocar toda a memória necessária antecipadamente.

Locais de DLL de runtime do AddressSanitizer

Os arquivos de runtime clang_rt.asan*.dll são instalados ao lado dos compiladores em %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Esses locais estão no caminho em sessões de depuração e em prompts de comando do desenvolvedor do Visual Studio. Esses arquivos nunca são colocados em C:\Windows\System32 ou C:\Windows\SysWOW64.

Suporte à folha de propriedades personalizada

A janela do Gerenciador de propriedades no IDE do Visual Studio permite que você adicione arquivos .props personalizados aos seus projetos. Embora a propriedade Habilitar Analisador de Endereços (<EnableASAN>) seja mostrada, o build não a respeita. Isso ocorre porque os arquivos personalizados .props são incluídos depois de Microsoft.cpp.props, o que usa o valor <EnableASAN> para definir outras propriedades.

Como solução alternativa, você pode criar um arquivo Directory.Build.props na raiz do projeto para definir a propriedade <EnableASAN>. Para obter mais informações, consulte Personalizar builds do C++.

Confira também

Visão geral do AddressSanitizer
Referência de linguagem e build do AddressSanitizer
Referência de runtime do AddressSanitizer
Bytes de sombra de AddressSanitizer
Nuvem do AddressSanitizer ou teste distribuído
Integração do depurador do AddressSanitizer
Exemplos de erro do AddressSanitizer