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.
- Las opciones de
/RTC
no son compatibles con AddressSanitizer y deben deshabilitarse. - La Vinculación incremental no es compatible y debe deshabilitarse.
- Editar y continuar no es compatible y debe deshabilitarse.
- Las corrutinas no son compatibles con AddressSanitizer y las funciones reanudables están exentas de la instrumentación.
- OpenMP no es compatible y debe deshabilitarse.
- C++ administrado no es compatible y debe deshabilitarse.
- C++ AMP no es compatible y debe deshabilitarse.
- Las aplicaciones de Plataforma universal de Windows (UWP) no son compatibles.
- Los archivos de la lista de casos especiales no son compatibles.
- MFC con la opción de tiempo de ejecución opcional
alloc_dealloc_mismatch
no es compatible.
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