O Google está comprometido em promover a equidade racial para as comunidades negras. Veja como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

HWAddressSanitizer

O AddressSanitizer assistido por hardware (HWASan) é uma ferramenta de detecção de erro de memória semelhante ao AddressSanitizer . O HWASan usa muito menos RAM em comparação com o ASan, o que o torna adequado para a higienização de todo o sistema. O HWASan está disponível apenas no Android 10 e superior e no hardware AArch64. Você pode fazer o flash de imagens HWASan pré-construídas para dispositivos Pixel suportados em ci.android.com ( instruções detalhadas de configuração ).

Comparado ao ASan clássico, o HWASan possui:

  • Sobrecarga de CPU semelhante (~ 2x)
  • Sobrecarga de tamanho de código semelhante (40 - 50%)
  • Sobrecarga de RAM muito menor (10% - 35%)

O HWASan detecta o mesmo conjunto de erros que o ASan:

  • Estouro / estouro de buffer de pilha e heap
  • Uso de pilha depois de grátis
  • Uso da pilha fora do escopo
  • Duplo grátis / grátis

Além disso, o HWASan detecta o uso da pilha após o retorno.

Detalhes e limitações da implementação

O HWASan é baseado na abordagem de marcação de memória , em que um pequeno valor de marcação aleatória é associado a ponteiros e a intervalos de endereços de memória. Para que um acesso à memória seja válido, o ponteiro e as tags de memória devem corresponder. O HWASan conta com o recurso TBI (Top Byte Ignore) do ARMv8, também chamado de marcação de endereço virtual , para armazenar a tag do ponteiro nos bits mais altos do endereço.

Você pode ler mais sobre o design do HWASan no site de documentação do Clang.

Por padrão, o HWASan não possui redzones de tamanho limitado do ASan para detectar estouros ou a quarentena de capacidade limitada do ASan para detectar o uso após o uso gratuito. Por esse motivo, o HWASan pode detectar um bug, não importa o tamanho do estouro ou há quanto tempo a memória foi desalocada. Isso oferece ao HWASan uma grande vantagem sobre o ASan.

No entanto, o HWASan tem um número limitado de valores possíveis de tags (256), o que significa que há uma probabilidade de 0,4% de perder qualquer bug durante uma execução do programa.

O HWASan requer que o kernel do Linux aceite ponteiros marcados nos argumentos de chamada do sistema. O suporte está disponível em kernels pré-criados para dispositivos Pixel 2, 3, 3a e 4 nos ramos Android 10 e superiores, e nos ramos de origem correspondentes no repositório de origem do kernel AOSP . Sabe-se que os pixels 2, 3, 3a e 4 funcionam com um sistema inteiro criado com o HWASan.

O suporte para dispositivos que não sejam Pixel está disponível no kernel comum do Android nas ramificações android-4.14 e superiores, mas não nas ramificações específicas do Android 10, como android-4.14-q . Você também precisa atualizar a cadeia de ferramentas LLVM para r370808 escolhendo a nova cadeia de ferramentas no CL 1182220 e a alteração do sistema de compilação correspondente no CL 1164431 .

Usando HWASan

Use os seguintes comandos para construir a plataforma inteira usando o HWASan:

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

Ao contrário do ASan, com o HWASan, não há necessidade de construir duas vezes. Construções incrementais funcionam, não há instruções especiais de flash ou requisitos de limpeza, executáveis ​​estáticos são suportados e não há problema em ignorar a higienização de qualquer biblioteca que não seja a libc . Também não há exigência de que, se uma biblioteca é higienizada, qualquer executável vinculado a ela também deve ser higienizado.

Para ignorar a higienização de um módulo, use LOCAL_NOSANITIZE := hwaddress ou sanitize: { hwaddress: false } .

Módulos individuais podem ser higienizados com o HWASan, com a ressalva de que a libc também é autorizada pelo HWASan. Isso pode ser feito adicionando sanitize: { hwaddress: true } à respectiva definição do módulo Android.bp . Toda a plataforma Android é construída com o HWASan ao usar uma _hwasan -suffixed (incluindo libc ) e, como tal, a limpeza manual da libc não é necessária para compilações do HWASan.

Melhores rastreamentos de pilha

O HWASan usa um desbobinador rápido baseado em ponteiro de quadro para registrar um rastreamento de pilha para cada evento de alocação e desalocação de memória no programa. O Android habilita ponteiros de quadro no código AArch64 por padrão, portanto, isso funciona muito bem na prática. Se você precisar relaxar o código gerenciado, configure HWASAN_OPTIONS=fast_unwind_on_malloc=0 no ambiente do processo. Observe que os rastreamentos de pilha de acesso à memória ruim usam o desbobinador "lento" por padrão; essa configuração afeta apenas os rastreamentos de alocação e desalocação. Essa opção pode consumir muita CPU, dependendo da carga.

Simbolização

Consulte Simbolização na documentação do ASan.

HWASan em aplicativos

Semelhante ao AddressSanitizer, o HWASan não pode ver o código Java, mas pode detectar erros nas bibliotecas JNI. Ao contrário do ASan, a execução de aplicativos HWASan em um dispositivo não HWASan não é suportada.

Em um dispositivo HWASan, os aplicativos podem ser verificados com o HWASan criando seu código com SANITIZE_TARGET:=hwaddress no Make ou -fsanitize=hwaddress nos sinalizadores do compilador.