- Discrepancias de alloc/dealloc y discrepancias de tipos new/delete
- Asignaciones demasiado grandes para el montón
- Desbordamiento de calloc y desbordamiento de alloca
- Doble liberación (double free) y uso después de liberar (use after free)
- Desbordamiento de variables globales
- Desbordamiento de búfer del montón
- Alineación no válida de valores alineados
- Superposición de parámetros de memcpy y strncat
- Desbordamiento y subdesbordamiento del búfer de la pila
- Uso de la pila después del retorno y uso después del ámbito
- Uso de memoria después de haberse marcado como envenenada
Habilitación de ASan en el compilador
Address Sanitizer está integrado con el sistema de proyectos de Visual Studio, el sistema de compilación CMake y el IDE. Los proyectos pueden habilitar AddressSanitizer mediante una opción adicional del compilador,/fsanitize=address, o estableciendo una propiedad del proyecto en Visual Studio:
Esta opción es compatible con todos los niveles de optimización y configuraciones de x64. Sin embargo, es incompatible con
edit-and-continue, incremental linking y /RTC, que deben deshabilitarse antes de compilar con ASan.$(VC_LibraryPath_VC_x64) sea el último de la lista para evitar que se use para otras bibliotecas, como se muestra a continuación:
Requisitos en tiempo de ejecución de ASan
Cuando un juego se compila con ASan habilitado, requiere que un archivo DLL adicional esté presente en tiempo de ejecución, que es lo que habilita la funcionalidad. De forma predeterminada, cuando ASan está habilitado en el compilador, copiará el archivo DLL en el directorio de salida de su proyecto y, después, debe implementarse en la consola junto al ejecutable. Si es necesario, los archivos DLL pueden encontrarse manualmente en el directorio$(VC_ExecutablePath_x64) de Visual Studio. XBOX requiere uno de estos dos, según la versión de compilación:
Compatibilidad del depurador en tiempo de ejecución
Al ejecutar un juego con ASan habilitado y un depurador conectado, si se encuentra un error, se interrumpirá en el depurador y se mostrará un informe detallado que le permitirá determinar dónde se produjo el error. Pero si se está ejecutando sin un depurador conectado, por ejemplo en un marco de pruebas automatizadas, la información del error se muestra en la salida estándar y el juego se cerrará. Esto puede ser útil, pero es posible que necesite más información de estado para encontrar la causa raíz del bloqueo, y es ahí donde entra la compatibilidad con volcados de memoria (Crash Dump).Si se está ejecutando sin un depurador conectado y necesita que los símbolos se resuelvan en ese momento, debe implementar el archivo
llvm-symbolizer.exe junto al archivo EXE de su juego. Este archivo puede encontrarse en la misma ubicación que los archivos DLL en tiempo de ejecución de ASan indicados anteriormente.Compatibilidad con volcados de memoria en tiempo de ejecución
A partir de Visual Studio 16.9.8 o 16.10.2, ASan puede configurarse para guardar un archivo de volcado de memoria que contiene los metadatos asociados al error. El depurador de Visual Studio puede analizar los metadatos guardados en el archivo de volcado para proporcionar más contexto sobre el bloqueo. Puede configurar este guardado de volcados de memoria por compilación, almacenar estos artefactos binarios y, después, verlos en el IDE con la indexación de código fuente adecuada. La documentación sobre volcados de memoria puede encontrarse aquí: Configuración de volcados de memoria (Microsoft Docs) Pero el enfoque vinculado anteriormente requiere establecer una variable de entorno, lo que no se admite en XBOX, por lo que se implementó un método alternativo. Para agregar compatibilidad con volcados de memoria a su título de XBOX, simplemente puede definir una función de devolución de llamada que proporcione a ASan la información necesaria del nombre de archivo del volcado de memoria; a continuación se muestran tres ejemplos.El nombre de archivo suele tener un sufijo .dmp para seguir las convenciones del IDE de Visual Studio
Al igual que con la función anterior, esta invalidación es opcional en XBOX, pero es muy recomendable si quiere usar volcados de memoria para recopilar información de ASan sin un depurador conectado. Si proporciona el nombre de archivo del volcado pero no una invalidación del tipo de volcado, no se podrá generar un volcado de memoria válido en XBOX.
Código de ejemplo de ASan
Este código demuestra la facilidad con la que estas funciones pueden agregarse a una base de código existente y adaptarse según sea necesario:Problemas conocidos
- ASan de Visual Studio 2019 (16.11) no es compatible con Game OS.
- El archivo DLL de ASan no es compatible con Game OS y no se cargará con las versiones iniciales de 17.12 y 17.13. Esto está corregido a partir de 17.12.6 y 17.13.3.
- Una regresión en la compatibilidad de ASan con Game OS que provocaba un bloqueo al iniciar con Visual Studio 2022 se corrigió en 17.14.29 y, en Visual Studio 2026, en 18.4.1.
- Con el depurador, al ejecutar en XBOX, el siguiente mensaje de excepción se emitirá con una cadencia regular, pero puede ignorarse sin problemas.
