Compartir vía


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

Invalidación del operador new y delete

AddressSanitizer (ASAN) tiene una versión personalizada de operator new y operator delete que usa para encontrar más errores de asignación, como alloc_dealloc_mismatch. La ejecución del enlazador con /INFERASANLIBS garantiza que la invalidación de new/delete de ASAN tenga prioridad baja, de modo que el enlazador elija cualquier invalidación de operator new o operator delete en otras bibliotecas a través de las versiones personalizadas de ASAN. Cuando esto sucede, ASAN puede no ser capaz de detectar algunos errores que dependen de su operator new personalizado y operator delete.

de MFC incluye invalidaciones personalizadas para operator new y operator delete, por lo que podría perder errores como alloc_dealloc_mismatch.

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