硬體輔助的 AddressSanitizer

請參閱瞭解 HWASan 報表,瞭解如何讀取 HWASan 當機情形!

硬體輔助的 AddressSanitizer (HWASan) 是記憶體錯誤 和類似 AddressSanitizer。HWASan 與 ASan 相比,RAM 大幅減少,因此適合 整個系統清理作業HWASan 僅適用於 Android 10 以及更高版本,且僅適用於 AArch64 硬體

雖然主要適用於 C/C++ 程式碼,但 HWASan 也能協助對造成錯誤的 Java 程式碼偵錯 用於實作 Java 介面的 C/C++ 發生當機情形。這項功能可以擷取回憶集錦 錯誤時,系統會直接指出負責的程式碼。

您可以從下列位置將預先建構的 HWASan 映像檔刷新至支援的 Pixel 裝置: ci.android.com (詳細的設定操作說明)。

相較於傳統 ASan,HWASan 具備以下特點:

  • 額外占用的 CPU 資源相近 (約 2 倍)
  • 額外占用程式碼的空間相近 (40 - 50%)
  • RAM 額外佔用的空間大幅減少 (10% - 35%)

HWASan 能夠偵測 ASan 可偵測到的錯誤:

  • 堆疊和堆積緩衝區溢位/反向溢位
  • 釋放後的堆積使用情況
  • 超出範圍的堆疊使用情況
  • 重複釋放/錯誤釋放

此外,HWASan 也會偵測傳回後的堆疊使用情況。

HWASan (與 ASan) 相容 UBSan、 這兩項功能可以同時在目標上啟用

實作詳情和限制

HWASan 是以 記憶體 廣告代碼,其中會隨機產生一個小型標記值 包括指標和記憶體位址範圍回憶集錦 指標和記憶體標記必須相符。 HWASan 依賴 ARMv8 功能頂層位元組忽略 (TBI),也稱為 虛擬地址標記,用於儲存指標標記 地址中最高位元的值。

如要進一步瞭解 設計 HWASan 的相關文件。

在設計上,HWASan 不會有 ASan 的限量紅區域 偵測溢位現象或 ASan 的有限容量隔離區 偵測免費後的使用情況因此,HWASan 能夠偵測 無論溢位多少 已分配。因此 HWASan 優於 ASan。

不過,HWASan 的可能標記值數量有限 (256), 代表有 0.4% 的機率會遺漏任何錯誤 都會看到這個狀態

需求條件

新版 (4.14 以上版本) 常見的 Android 核心支援 立即可用的 HWASan。Android 10 特定分支版本不支援 HWASan。

HWASan 支援自 Android 11 以上版本。

如果您要使用其他核心,HWASan 需要 Linux kernel,才能接受在 系統呼叫引數已在下列上游修補程式集實作此功能:

如果您使用自訂工具鍊進行建構,請確保其中包含所有 LLVM 修訂版本 c336557f

使用 HWASan

請使用下列指令,使用 HWASan 建構整個平台:

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

為了方便起見,您可以在產品定義中加入 SANITIZE_TARGET 設定。 類似 aosp_coral_hwasan

對於熟悉 AddressSanitizer 的使用者而言,大幅降低建構的複雜度:

  • 無須執行兩次。
  • 漸進式建構可立即使用。
  • 不需要更新使用者資料。

部分 AddressSanitizer 限制也會一併移除:

  • 支援靜態執行檔。
  • 您可以略過 libc 以外的任何目標清理作業。不過,和 ASan 不同的是 不要求如果程式庫經過淨化,則任何連結該程式庫的執行檔亦不得如此。

您可以切換使用相同 (或更高) 版本編號的 HWASan 和一般映像檔 完全不必費心處理您不一定要清除裝置資料。

如要略過模組的清理作業,請使用 LOCAL_NOSANITIZE := hwaddress (Android.mk) 或 sanitize: { hwaddress: false } (Android.bp)。

清除個別目標

只要 libc.so 消毒。將 hwaddress: true 新增至 "libc_defaults" 中的清理區塊 Bnic/libc/Android.bp。然後對著目標進行同樣的操作。

請注意,清理 libc 可讓您標記整個系統的堆積記憶體配置,以及 檢查 libc.so 內記憶體作業的標記。即使在二進位檔中,也可能在二進位檔中發現錯誤 如果 libc.so 中的記憶體存取品質不佳,系統就不會啟用 HWASan (例如:pthread_mutex_unlock() (在 delete() 互斥鎖上)。

如果整個平台是以 HWASan 建構而成,則無需變更任何建構檔案。

閃電所

為了進行開發作業,您可以將支援 HWASan 的 Android 開放原始碼計畫版本刷新到 Pixel 裝置 並使用 Flashstation,在系統上解鎖的系統啟動載入程式。 選取 _hwasan 目標,例如:aosp_flame_hwasan-userdebug詳情請參閱 HWASan 適用的 NDK 說明文件

改善堆疊追蹤

HWASan 使用以影格指標為基礎的快速解開器錄製堆疊 深入分析 計畫。Android 在 AArch64 程式碼中預設會啟用影格指標 所以實際操作方式非常好如果需要放鬆身心 受管理的程式碼,設定 HWASAN_OPTIONS=fast_unwind_on_malloc=0 程序環境請注意,記憶體存取堆疊錯誤 追蹤記錄會使用「慢速」預設為展開模式;這項設定只會影響 配置和交易配置追蹤記錄建議您 耗用大量 CPU 資源,視負載量而定。

符號化

請參閱「符號化」 「瞭解 HWASan 報告」一節。

應用程式中的 HWASan

與 AddressSanitizer 類似,HWASan 無法找出 Java 程式碼,但 就能偵測 JNI 程式庫中的錯誤在 Android 14 以下版本,執行 HWASan 系統「不」支援非 HWASan 裝置上的應用程式。

在 HWASan 裝置上,應用程式可透過 HWASan 建立 在以下位置使用 SANITIZE_TARGET:=hwaddress 程式碼 Make,或編譯器標記中的 -fsanitize=hwaddress。 如果是搭載 Android 14 以上版本的非 HWASan 裝置,則需使用 wrap.sh 檔案設定 尚未新增 LD_HWASAN=1。 詳情請參閱 應用程式開發人員說明文件 ,掌握更多詳細資訊。