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.
- As opções
/RTC
são incompatíveis com o AddressSanitizer e devem ser desabilitadas. - A vinculação incremental não tem suporte e deve ser desabilitada.
- Editar e continuar não tem suporte e deve ser desabilitada.
- Corrotinas são incompatíveis com o AddressSanitizer e as funções retomáveis são isentas de instrumentação.
- OpenMP não tem suporte e deve ser desabilitada.
- Managed C++ não tem suporte e deve ser desabilitada.
- C++ AMP não tem suporte e deve ser desabilitada.
- Aplicativos Universal Windows Platform (UWP) não têm suporte.
- Arquivos de lista de casos especiais não têm suporte.
- Não há suporte para o MFC usando a opção de runtime opcional
alloc_dealloc_mismatch
.
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