Tiempo de ejecución de AddressSanitizer
La biblioteca en tiempo de ejecución AddressSanitizer intercepta las funciones y operaciones comunes de asignación de memoria para habilitar la inspección de los accesos a memoria. Hay varias bibliotecas en tiempo de ejecución diferentes que admiten los distintos tipos de ejecutables que el compilador puede generar. El compilador y el vinculador vinculan automáticamente las bibliotecas en tiempo de ejecución adecuadas, siempre y cuando se pase /fsanitize=address la opción en tiempo de compilación. Puede invalidar el comportamiento predeterminado mediante la opción /NODEFAULTLIB en el momento del vínculo. Para obtener más información, vea la sección sobre la vinculación en el lenguaje AddressSanitizer, lacompilación y la referencia de depuración .
A continuación se muestra un inventario de bibliotecas en tiempo de ejecución para vincular al entorno de ejecución AddressSanitizer, donde {arch} es i386 o x86_64 .
Nota:
Estas bibliotecas mantienen las convenciones de Clang para los nombres de arquitectura. Las MSVC las convenciones son normalmente x86 y x64 en lugar de i386 y x86_64. Hacen referencia a las mismas arquitecturas.
| Opción crt | DLL o EXE | ¿DEPURACIÓN? | Bibliotecas de archivos binarios en tiempo de ejecución de AddressSanitizer |
|---|---|---|---|
| MT | EXE | No | clang_rt.asan-{arch}, clang_rt.asan_cxx-{arch} |
| MT | Archivo DLL | No | clang_rt.asan_dll_thunk-{arch} |
| MD | YA SEA | No | clang_rt.asan_dynamic-{arch}, clang_rt.asan_dynamic_runtime_thunk-{arch} |
| MT | EXE | SÍ | clang_rt.asan_dbg-{arch}, clang_rt.asan_dbg_cxx-{arch} |
| MT | Archivo DLL | SÍ | clang_rt.asan_dbg_dll_thunk-{arch} |
| MD | YA SEA | SÍ | clang_rt.asan_dbg_dynamic-{arch}, clang_rt.asan_dbg_dynamic_runtime_thunk-{arch} |
Al compilar con cl /fsanitize=address , el compilador genera instrucciones para administrar y comprobar los bytes de cl /fsanitize=address. El programa usa esta instrumentación para comprobar los accesos a memoria en la pila, en el montón o en el ámbito global. El compilador también genera metadatos que describen la pila y las variables globales. Estos metadatos permiten al tiempo de ejecución generar diagnósticos de errores precisos: nombres de función, líneas y columnas en el código fuente. Combinadas, las comprobaciones del compilador y las bibliotecas en tiempo de ejecución pueden diagnosticar con precisión muchos tipos de errores de seguridad de memoria si se encuentran en tiempo de ejecución.
Interceptación de funciones
AddressSanitizer logra la intercepción de funciones a través de muchas técnicas de aplicación de revisiones en caliente. Estas técnicas se documentan mejor en el propio código fuente.
Las bibliotecas en tiempo de ejecución interceptan muchas funciones comunes de administración de memoria y manipulación de memoria. Para obtener una lista, vea AddressSanitizer list of intercepted functions. Los interceptores de asignación administran metadatos y bytes de sombra relacionados con cada llamada de asignación. Cada vez que se llama a una función de CRT como o , los interceptores establecen valores específicos en la región de memoria instantánea malloc AddressSanitizer para indicar si esas ubicaciones del montón son accesibles actualmente y cuáles son los límites de la delete asignación. Estos bytes de sombra permiten que las comprobaciones generadas por el compilador de los bytes de sombra determinen si una carga o un almacén es válido.
No se garantiza que la interceptación se realiza correctamente. Si un prólogo de función es demasiado corto para que jmp se escriba, la interceptación puede producir un error. Si se produce un error de interceptación, el programa inicia y debugbreak se detiene. Si adjunta un depurador, deja clara la causa del problema de interceptación. Si tiene este problema, informe de un error.
Nota:
Opcionalmente, los usuarios pueden intentar continuar después de una interceptación con errores estableciendo la variable de entorno ASAN_WIN_CONTINUE_ON_INTERCEPTION_FAILURE en cualquier valor. Si continúa después de un error de interceptación, se pueden perder informes de errores para esa función.
Asignadores personalizados y el tiempo de ejecución de AddressSanitizer
El tiempo de ejecución addressSanitizer proporciona interceptores para interfaces de asignador comunes, malloc/free , new/deleteHeapAlloc/HeapFree , (a través de RtlAllocateHeap/RtlFreeHeap ). Muchos programas hacen uso de asignadores personalizados por un motivo u otro, un ejemplo sería cualquier programa que use o una solución dlmalloc que use la interfaz y std::allocatorVirtualAlloc() . El compilador no puede agregar automáticamente llamadas de administración de memoria sombra a un asignador personalizado. Es responsabilidad del usuario usar la interfaz de poisoning manual proporcionada. Esta API permite que estos asignadores funcionen correctamente con las convenciones addressSanitizer runtime y shadow byte existentes.
Interfaz de poisoning de AddressSanitizer manual
La interfaz para la iluminación es sencilla, pero impone restricciones de alineación al usuario. Los usuarios pueden importar estos prototipos mediante la importación de sanitizer/asan_interface.h . Estos son los prototipos de función de interfaz:
void __asan_poison_memory_region(void const volatile *addr, size_t size);
void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
Para mayor comodidad, el archivo de encabezado de interfaz AddressSanitizer proporciona macros contenedoras. Estas macros comprueban si la funcionalidad AddressSanitizer está habilitada durante la compilación. Permiten que el código fuente omita las llamadas de función de poisoning cuando no son necesarias. Estas macros deben ser preferibles a llamar directamente a las funciones anteriores:
#define ASAN_POISON_MEMORY_REGION(addr, size)
#define ASAN_UNPOISON_MEMORY_REGION(addr, size)
Requisitos de alineación para el dudoso addressSanitizer
Cualquier dudoso manual de bytes de sombra debe tener en cuenta los requisitos de alineación. El usuario debe agregar relleno si es necesario para que los bytes de sombra terminen en un límite de bytes en la memoria de sombra. Cada bit de la memoria de sombra AddressSanitizer codifica el estado de un solo byte en la memoria de la aplicación. Esta codificación significa que el tamaño total de cada asignación, incluido cualquier relleno, debe alinearse con un límite de 8 bytes. Si no se cumple el requisito de alineación, puede provocar informes de errores incorrectos. Los informes incorrectos podrían manifestarse como informes que faltan (falsos negativos) o informes de no errores (falsos positivos).
Para obtener una ilustración del requisito de alineación y los posibles problemas, vea los ejemplos de alineación de ASan proporcionados. Uno es un pequeño programa para mostrar lo que puede ir mal con el dudoso manual de memoria en la sombra. La segunda es una implementación de ejemplo del dudoso manual mediante la std::allocator interfaz .
Opciones en tiempo de ejecución
Microsoft C/C++ (MSVC) usa un runtime basado en el entorno de ejecución Clang AddressSanitizer del repositorio llvm-project. Por este problema, la mayoría de las opciones en tiempo de ejecución se comparten entre las dos versiones. Hay disponible una lista completa de las opciones de tiempo de ejecución de Clang pública aquí. Documentemos algunas diferencias en las secciones siguientes. Si detecta opciones que no funcionan según lo previsto, informe de un error.
Opciones de AddressSanitizer no admitidas
- detect_container_overflow
- unmap_shadow_on_exit
Nota:
La opción en tiempo de ejecución AddressSanitizer halt_on_error no funciona de la manera esperada. Tanto en clang como en MSVC en tiempo de ejecución, muchos tipos de error se consideran no continuables, incluidos la mayoría de los errores de daños en la memoria.
Para más información, consulte la sección Diferencias con Clang 12.0.
MSVC de tiempo de ejecución addressSanitizer específico
windows_hook_legacy_allocatorsBooleano, establecido entruepara habilitar la interceptación de losGlobalAllocLocalAllocasignadores y .
Nota:
La opción windows_hook_legacy_allocators no estaba disponible en el entorno de ejecución público llvm-project cuando se escribió este artículo. La opción puede devolverse al proyecto público. sin embargo, depende de la revisión del código y la aceptación de la comunidad.
La opción , anteriormente una característica opcional mientras windows_hook_rtl_allocators AddressSanitizer era experimental, ahora está habilitada de forma predeterminada.
Lista addressSanitizer de funciones interceptadas (Windows)
El tiempo de ejecución AddressSanitizer revisa activamente muchas funciones para habilitar las comprobaciones de seguridad de memoria en tiempo de ejecución. Esta es una lista no exhaustiva de las funciones que supervisa el entorno de ejecución addressSanitizer.
Interceptores predeterminados
- (solo x64)
_aligned_free_aligned_malloc_aligned_msize_aligned_realloc_calloc_base_calloc_crt- (solo en tiempo de ejecución de depuración)
- (solo x86)
- (solo x86) (no documentado)
_expand_expand_base(no documentado)- (solo en tiempo de ejecución de depuración)
_free_base(no documentado)- (solo en tiempo de ejecución de depuración)
_malloc_base(no documentado)_malloc_crt(no documentado)- (solo en tiempo de ejecución de depuración)
_msize_msize_base(no documentado)- (solo en tiempo de ejecución de depuración)
_realloc_base(no documentado)_realloc_crt(no documentado)- (solo en tiempo de ejecución de depuración)
_recalloc_recalloc_base(no documentado)_recalloc_crt(no documentado)- (solo en tiempo de ejecución de depuración)
_strdupatoiatolcallocCreateThreadfreefrexplongjmpmallocmemchrmemcmpmemcpymemmovememsetRaiseExceptionreallocRtlAllocateHeapRtlCreateHeapRtlDestroyHeapRtlFreeHeapRtlRaiseExceptionRtlReAllocateHeap(no documentado)RtlSizeHeap(no documentado)SetUnhandledExceptionFilterstrcatstrchrstrcmpstrcpystrcspnstrdupstrlenstrncatstrncmpstrncpystrnlenstrpbrkstrspnstrstrstrtokstrtolwcslenwcsnlen
Interceptores opcionales
Los interceptores enumerados aquí solo se instalan cuando se habilita una opción de tiempo de ejecución AddressSanitizer. Establezca windows_hook_legacy_allocators en para habilitar la true interceptación del asignador heredado.
set ASAN_OPTIONS=windows_hook_legacy_allocators=true
GlobalAllocGlobalFreeGlobalHandleGlobalLockGlobalReAllocGlobalSizeGlobalUnlockLocalAllocLocalFreeLocalHandleLocalLockLocalReAllocLocalSizeLocalUnlock
Vea también
Información general de AddressSanitizer
Problemas conocidos de AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Bytes paralelos de AddressSanitizer
Nube o pruebas distribuidas de AddressSanitizer
Integración del depurador de AddressSanitizer
Ejemplos de errores de AddressSanitizer