Google se compromete a promover la equidad racial para las comunidades negras. Ver cómo.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

HWAddressSanitizer

AddressSanitizer asistido por hardware (HWASan) es una herramienta de detección de errores de memoria similar a AddressSanitizer . HWASan usa mucha menos RAM en comparación con ASan, lo que lo hace adecuado para la desinfección de todo el sistema. HWASan solo está disponible en Android 10 y superior, y en hardware AArch64. Puede flashear imágenes HWASan preconstruidas a dispositivos Pixel compatibles desde ci.android.com ( instrucciones de configuración detalladas ).

En comparación con ASan clásico, HWASan tiene:

  • Sobrecarga de CPU similar (~ 2x)
  • Tamaño de código similar sobrecarga (40 - 50%)
  • Sobrecarga de RAM mucho menor (10% - 35%)

HWASan detecta el mismo conjunto de errores que ASan:

  • Desbordamiento / desbordamiento del búfer de pila y pila
  • Uso del montón después de libre
  • Uso de la pila fuera del alcance
  • Doble libre / libre salvaje

Además, HWASan detecta el uso de la pila después del retorno.

Detalles de implementación y limitaciones

HWASan se basa en el enfoque de etiquetado de memoria , donde un pequeño valor de etiqueta aleatorio se asocia tanto con punteros como con rangos de direcciones de memoria. Para que un acceso a memoria sea válido, el puntero y las etiquetas de memoria deben coincidir. HWASan se basa en la función ARMv8 ignorar el byte superior (TBI), también llamado etiquetado de dirección virtual , para almacenar la etiqueta de puntero en los bits más altos de la dirección.

Puede leer más sobre el diseño de HWASan en el sitio de documentación de Clang.

Por diseño, HWASan no tiene las zonas rojas de tamaño limitado de ASan para detectar desbordamientos o la cuarentena de capacidad limitada de ASan para detectar el uso después de la liberación. Por esta razón, HWASan puede detectar un error sin importar qué tan grande sea el desbordamiento o cuánto tiempo hace que se desasignó la memoria. Esto le da a HWASan una gran ventaja sobre ASan.

Sin embargo, HWASan tiene un número limitado de posibles valores de etiqueta (256), lo que significa que hay una probabilidad del 0,4% de perder cualquier error durante una ejecución del programa.

HWASan requiere que el kernel de Linux acepte punteros etiquetados en los argumentos de llamada del sistema. El soporte está disponible en núcleos preconstruidos para dispositivos Pixel 2, 3, 3a y 4 en Android 10 y ramas superiores, y en las ramas fuente correspondientes en el repositorio de fuentes del núcleo AOSP . Se sabe que los píxeles 2, 3, 3a y 4 funcionan con un sistema completo construido con HWASan.

El soporte para dispositivos que no son Pixel está disponible en el kernel común de Android en Android-4.14 y en las ramas superiores, pero no en las ramas específicas de Android 10 como Android-4.14-q . También debe actualizar la cadena de herramientas LLVM a r370808 seleccionando la nueva cadena de herramientas en CL 1182220 y el cambio del sistema de compilación correspondiente en CL 1164431 .

Usando HWASan

Use los siguientes comandos para construir toda la plataforma usando HWASan:

lunch aosp_walleye-userdebug # (or any other product)
make SANITIZE_TARGET=hwaddress

A diferencia de ASan, con HWASan no hay necesidad de construir dos veces. Las compilaciones incrementales simplemente funcionan, no hay instrucciones especiales de flasheo ni requisitos de borrado, se admiten ejecutables estáticos y está bien omitir la desinfección de cualquier biblioteca que no sea libc . Tampoco hay ningún requisito de que si se desinfecta una biblioteca, también se debe desinfectar cualquier ejecutable que se vincule a ella.

Para omitir la desinfección de un módulo, use LOCAL_NOSANITIZE := hwaddress o sanitize: { hwaddress: false } .

Los módulos individuales se pueden desinfectar con HWASan, con la advertencia de que libc también tiene HWASan. Esto se puede hacer agregando sanitize: { hwaddress: true } a la definición del módulo Android.bp correspondiente. Toda la plataforma Android está construida con HWASan cuando se utiliza una _hwasan -suffixed (incluida libc ), y como tal, no es necesario desinfectar manualmente libc para las compilaciones de HWASan.

Mejores rastros de pila

HWASan utiliza un desbobinador rápido basado en puntero de cuadro para registrar un seguimiento de la pila para cada asignación de memoria y evento de desasignación en el programa. Android habilita punteros de fotogramas en el código AArch64 de forma predeterminada, por lo que esto funciona muy bien en la práctica. Si necesita relajarse a través del código administrado, configure HWASAN_OPTIONS=fast_unwind_on_malloc=0 en el entorno del proceso. Tenga en cuenta que las trazas de pila de acceso a memoria incorrecta usan el desbobinador "lento" de forma predeterminada; Esta configuración solo afecta a las asignaciones de asignación y desasignación. Esta opción puede requerir mucha CPU, dependiendo de la carga.

Simbolización

Consulte Simbolización en la documentación de ASan.

HWASan en aplicaciones

Al igual que AddressSanitizer, HWASan no puede ver el código Java, pero puede detectar errores en las bibliotecas JNI. A diferencia de ASan, no se admite la ejecución de aplicaciones HWASan en un dispositivo que no sea ​​HWASan.

En un dispositivo HWASan, las aplicaciones se pueden verificar con HWASan construyendo su código con SANITIZE_TARGET:=hwaddress en Make, o -fsanitize=hwaddress en los indicadores del compilador.