Partilhar via


Problemas conhecidos do AddressSanitizer

Observação

Envie-nos de feedback sobre o que você gostaria de ver em versões futuras e relatar bugs se tiver problemas.

Opções e funcionalidades incompatíveis

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

  • As opções de /RTC são incompatíveis com o AddressSanitizer e devem ser desativadas.
  • de vinculação incremental não é suportada e deve ser desabilitada.
  • Editar e Continuar não é suportado e deve ser desativado.
  • Co-rotinas são incompatíveis com o AddressSanitizer, e as funções retomáveis estão isentas de instrumentação.
  • OpenMP não é suportado e deve ser desativado.
  • C++ Gerenciado não é suportado e deve ser desabilitado.
  • AMP C++ não é suportado e deve ser desativado.
  • aplicativos da Plataforma Universal do Windows(UWP) não são suportados.
  • Lista de casos especiais arquivos não são suportados.

Suporte de biblioteca padrão

A biblioteca padrão MSVC (STL) é parcialmente iluminada 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 desativadas ou em versões sem suporte, as exceções do AddressSanitizer geradas no código STL ainda identificam bugs verdadeiros. No entanto, eles não são tão precisos 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;
}

Substituindo operador novo e excluir

AddressSanitizer (ASAN) tem uma versão personalizada do operator new e operator delete que ele usa para encontrar mais erros de alocação como alloc_dealloc_mismatch. A execução do vinculador com /INFERASANLIBS garante que a substituição de new/delete do ASAN tenha baixa precedência, de modo que o vinculador escolha qualquer substituição de operator new ou operator delete em outras bibliotecas em relação às versões personalizadas do ASAN. Quando isso acontece, o ASAN pode não ser capaz de detetar alguns erros que dependem de sua operator new personalizada e operator delete.

MFC inclui substituições personalizadas para operator new e operator delete e, portanto, pode perder erros como alloc_dealloc_mismatch.

Versões do Windows

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

Utilização da memória

O tempo de execução 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. Esta decisão de design é intencional, de modo a não alocar toda a memória necessária antecipadamente.

Locais de DLL de tempo de execução do AddressSanitizer

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

Suporte a folhas de propriedades personalizadas

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

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

Ver também

Visão geral do AddressSanitizer
de compilação e referência de linguagem AddressSanitizer
de referência de tempo de execução AddressSanitizer
AddressSanitizer shadow bytes
AddressSanitizer na nuvem ou de testes distribuídos
de integração do depurador AddressSanitizer
Exemplos de erro AddressSanitizer