Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

HWAddressSanitizer

Asistida por hardware AddressSanitizer (Hwasan) es una herramienta de detección de error 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 solo en hardware AArch64.

Aunque es principalmente útil para el código C / C ++, HWASan también puede ayudar a depurar el código Java que causa bloqueos en C / C ++ utilizado para implementar interfaces Java. Es útil porque detecta errores de memoria cuando ocurren, y le indica directamente el código responsable.

Puede parpadear prediseñados imágenes Hwasan a dispositivos compatibles de Pixel ci.android.com ( instrucciones de configuración detalladas ).

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

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

HWASan detecta el mismo conjunto de errores que ASan:

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

Además, HWASan detecta el uso de la pila después de la devolución.

Detalles y limitaciones de la implementación

Hwasan se basa en el etiquetado de memoria aproximación, donde un pequeño valor de la etiqueta al azar se asocia tanto con punteros y con rangos de direcciones de memoria. Para que un acceso a la memoria sea válido, el puntero y las etiquetas de memoria deben coincidir. Hwasan se apoya en la parte superior ARMv8 función de bytes ignorar (TBI), también llamada dirección de etiquetado virtual, para almacenar la etiqueta de puntero en las más altas bits de la dirección.

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

Por diseño, HWASan no tiene redzones de tamaño limitado de ASan para detectar desbordamientos o la cuarentena de capacidad limitada de ASan para detectar el uso después de que esté libre. Por esta razón, HWASan puede detectar un error sin importar cuán 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 un 0,4% de probabilidad de perder algún error durante una ejecución del programa.

Requisitos

HWASan requiere que el kernel de Linux acepte punteros etiquetados en los argumentos de llamada al sistema. El soporte para esto se implementó en los siguientes conjuntos de parches ascendentes:

Estos parches están disponibles como backports en el común kernel Android en Android-4.14 y las ramas más altas, pero no en Android ramas 10-específicas, tales como android-4,14-q .

Apoyo para el espacio de usuario Hwasan está disponible a partir de Android 11.

Si usted está construyendo con una cadena de herramientas personalizada, asegúrese de que incluye todo, hasta LLVM cometer c336557f .

Usando HWASan

Utilice los siguientes comandos para construir la plataforma completa usando HWASan:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Para mayor comodidad, puede agregar el ajuste SANITIZE_TARGET a una definición del producto, similar a aosp_coral_hwasan .

A diferencia de ASan, con HWASan no es necesario compilar dos veces. Compilaciones incrementales funcionan igual, no hay especial intermitente instrucciones o limpiar requisito, ejecutables estáticas son compatibles, y que está bien para omitir la desinfección de cualquier biblioteca que no sea libc . Tampoco hay ningún requisito de que si una biblioteca se desinfecta, cualquier ejecutable que se vincule a ella también debe desinfectarse.

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

Los módulos individuales pueden ser desinfectados con Hwasan, con la advertencia de que libc está también Hwasan ified. Esto puede hacerse mediante la adición de sanitize: { hwaddress: true } a los respectivos Android.bp definición de módulo. Toda la plataforma Android está construido con Hwasan cuando se utiliza un _hwasan acumulación -suffixed (incluyendo libc ), y como tal desinfección manual libc no es necesario que se basa Hwasan.

Mejores trazas de pila

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

Simbolización

Ver simbolización en la documentación 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, correr aplicaciones en Hwasan no es compatible con un dispositivo no Hwasan.

En un dispositivo Hwasan, las aplicaciones pueden ser comprobadas con Hwasan mediante la construcción de su código con SANITIZE_TARGET:=hwaddress adentro hace, o -fsanitize=hwaddress en opciones del compilador. Consulte la documentación del desarrollador de la aplicación para obtener más detalles.