Compartir por


Problemas conocidos de AddressSanitizer

Nota:

Envíenos comentarios sobre lo que le gustaría ver en futuras versiones, así como para informar de errores si tiene problemas.

Opciones y funcionalidades incompatibles

Estas opciones y funciones no son compatibles con /fsanitize=address y deben deshabilitarse o evitarse.

Compatibilidad con biblioteca estándar

La biblioteca estándar de MSVC (STL) está parcialmente habilitada para comprender addressSanitizer y proporcionar otras comprobaciones. Para más, vea error de desbordamiento de contenedor.

Cuando las anotaciones están deshabilitadas o en versiones sin soporte técnico, las excepciones AddressSanitizer generadas en el código STL siguen identificando errores verdaderos. Sin embargo, no son tan precisos como podrían ser.

En este ejemplo se muestra la falta de precisión y las ventajas de habilitar anotaciones:

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

Versiones de Windows

Como hay dependencias con versiones específicas de Windows, la compatibilidad se centra en Windows 10. MSVC AddressSanitizer se probó en la versión 10.0.14393 (RS1) y 10.0.21323 (compilación preliminar de Insider). Notifique un error si tiene problemas.

Uso de la memoria

El tiempo de ejecución AddressSanitizer no libera memoria al sistema operativo durante la ejecución. Desde el punto de vista del sistema operativo, puede parecer que hay una fuga de memoria. Esta decisión de diseño es intencionada para que no se asigne por adelantado toda la memoria necesaria.

Ubicaciones de DLL del entorno de ejecución AddressSanitizer

Los archivos en tiempo de ejecución clang_rt.asan*.dll se instalan junto a los compiladores de %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\. Estas ubicaciones se encuentran en la ruta de acceso de las sesiones de depuración y en los símbolos del sistema para desarrolladores de Visual Studio. Estos archivos nunca se colocan en C:\Windows\System32 o C:\Windows\SysWOW64.

Compatibilidad con hojas de propiedades personalizadas

La ventana Administrador de propiedades del IDE de Visual Studio permite agregar archivos .props personalizados a los proyectos. Aunque se muestra la propiedad Enable Address Sanitizer (<EnableASAN>), la compilación no la respeta. Esto se debe a que los archivos personalizados .props se incluyen después de Microsoft.cpp.props, que usa el valor <EnableASAN> para establecer otras propiedades.

Como solución alternativa, puede crear un archivo Directory.Build.props en la raíz del proyecto para definir la propiedad <EnableASAN>. Para más información, consulte Personalizar compilaciones de C++.

Consulte también

Introducción a AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Referencia del entorno de ejecución addressSanitizer
Bytes de sombra addressSanitizer
Pruebas distribuidas o en la nube addressSanitizer
Integración del depurador AddressSanitizer
Ejemplos de errores addressSanitizer