Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

HWAddressSanitizer

硬件輔助的AddressSanitizer(HWASan)是類似於AddressSanitizer的內存錯誤檢測工具。與ASan相比,HWASan使用的RAM少得多,這使其適用於整個系統的清理。 HWASan僅在Android 10及更高版本以及AArch64硬件上可用。您可以從ci.android.com將預構建的HWASan圖像閃存到受支持的Pixel設備(詳細的安裝說明)。

與經典的ASan相比,HWASan具有:

  • 類似的CPU開銷(〜2倍)
  • 類似的代碼大小開銷(40 – 50%)
  • 較小的RAM開銷(10%– 35%)

HWASan檢測到與ASan相同的錯誤集:

  • 堆棧緩衝區溢出/下溢
  • 免費使用後堆
  • 堆棧使用超出範圍
  • 雙人免費/野生免費

此外,HWASan在返回後會檢測堆棧使用情況。

實施細節和限制

HWASan基於內存標記方法,其中一個小的隨機標記值既與指針也與內存地址範圍相關聯。為了使內存訪問有效,指針和內存標籤必須匹配。 HWASan依靠ARMv8功能最高字節忽略(TBI)(也稱為虛擬地址標記)將指針標記存儲在地址的最高位。

您可以在Clang文檔站點上閱讀有關HWASan設計的更多信息。

根據設計,HWASan沒有用於檢測溢出的ASan限制大小的紅色區域,也沒有用於檢測釋放後使用情況的ASan的有限容量隔離區。因此,無論溢出有多大或多長時間釋放了內存,HWASan都可以檢測到錯誤。這使HWASan優於ASan。

但是,HWASan具有有限數量的可能標記值(256),這意味著在程序的一次執行過程中丟失任何錯誤的可能性為0.4%。

要求

HWASan要求Linux內核在系統調用參數中接受標記的指針。在以下上游補丁集中實現了對此的支持:

這些補丁可在android-4.14和更高版本的分支中作為通用Android內核中的反向移植使用,但在特定於Android 10的分支(例如android-4.14-q)中不可用。

Android 11開始,將為HWASan提供用戶空間支持。

如果要使用自定義工具鏈進行構建,請確保它包括LLVM commit c336557f之前的所有內容

使用HWASan

使用以下命令使用HWASan構建整個平台:

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

為了方便起見,您可以將SANITIZE_TARGET設置添加到產品定義中,類似於aosp_coral_hwasan

與ASan不同,使用HWASan不需要進行兩次構建。增量構建可以正常工作,沒有特殊的刷新指令或擦除要求,支持靜態可執行文件,並且可以跳過除libc之外的任何庫的清理工作。也沒有要求如果清理了一個庫,那麼鏈接到它的任何可執行文件也必須被清理。

要跳過模塊的清理,請使用LOCAL_NOSANITIZE := hwaddresssanitize: { hwaddress: false }

可以使用HWASan消毒各個模塊,但需要注意的是, libc也已通過HWASan標準化。這可以通過在相應的Android.bp模塊定義中添加sanitize: { hwaddress: true }來完成。當使用_hwasan後綴的版本(包括libc )時,整個Android平台都是使用HWASan構建的,因此,對於HWASan版本,無需手動清理libc

更好的堆棧跟踪

HWASan使用基於幀指針的快速展開器為程序中的每個內存分配和釋放事件記錄堆棧跟踪。 Android默認情況下以AArch64代碼啟用幀指針,因此在實踐中效果很好。如果您需要展開託管代碼,請在流程環境中設置HWASAN_OPTIONS=fast_unwind_on_malloc=0 。請注意,默認情況下,錯誤的內存訪問堆棧跟踪使用“慢速”展開器;此設置僅影響分配和釋放跟踪。此選項可能會佔用大量CPU,具體取決於負載。

符號化

請參閱ASan文檔中的符號化。

HWASan在應用中

與AddressSanitizer相似,HWASan無法查看Java代碼,但它可以檢測JNI庫中的錯誤。與ASan不同,支持在非HWASan設備上運行HWASan應用程序。

在HWASan設備上,可以通過在Make中使用SANITIZE_TARGET:=hwaddress或在編譯器標誌中使用-fsanitize=hwaddress來構建應用程序的代碼來對應用程序進行HWASan檢查。有關更多詳細信息,請參見應用開發者文檔