Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

標記指針

從Android R開始,對於64位進程,所有堆分配都在具有ARM Top-byte Ignore(TBI)內核支持的設備上的指針的高字節中設置了實現定義的標記。在釋放過程中檢查標籤後,所有修改該標籤的應用程序都會終止。對於具有ARM內存標記擴展 (MTE)支持的未來硬件,這是必需的。

高位字節忽略

所有Armv8 AArch64硬件中的64位代碼都可使用ARM的高位字節忽略功能。此功能意味著在訪問內存時,硬件將忽略指針的最高字節。

TBI需要兼容的內核 ,該內核可以正確處理從用戶空間傳遞的帶標記的指針。 4.14(Pixel 4)及更高版本的Android Common Kernels具有所需的TBI補丁

在進程啟動時動態檢測內核中支持TBI的設備,並將與實現相關的標記插入所有堆分配的指針的最高字節。此後,將運行檢查以確保在分配內存時標籤沒有被截斷。

內存標記擴展就緒

ARM的內存標記擴展(MTE)有助於解決內存安全問題。 MTE通過標記堆棧,堆和全局變量上每個內存分配的第56-59地址位來工作。每次訪問存儲器時,硬件和指令集都會自動檢查是否使用了正確的標籤。

保證將信息錯誤地存儲在指針的最高字節中的Android應用在啟用MTE的設備上斷開 。帶標記的指針使在MTE設備可用之前更容易檢測和拒絕不正確使用指針的高位字節。

開發者支持

如果您的應用崩潰了,並且提示您使用此鏈接,則可能表示以下情況之一:

  1. 該應用程序試圖釋放系統堆分配器未分配的指針。
  2. 您的應用中的某些內容修改了指針的最高字節。指針的最高字節不能被修改,您的代碼需要更改以解決此問題。

錯誤地修改了最高字節指針的示例。

  • 指向特定類型的指針將特定於應用程序的元數據存儲在前16個地址位中。
  • 指針先轉換為兩倍然後返回,從而丟失了低位地址。
  • 通過代碼計算來自不同堆棧幀的局部變量的地址之間的差異,以此作為測量遞歸深度的一種方法。

某些應用程序可能依賴於在設置指針的最高字節時行為不正確的庫。我們認識到,快速解決庫中的這些潛在問題可能並不容易。因此,使用targetSdkLevel < R應用程序默認情況下不會啟用指針標記。我們還為Android R或更高版本構建的應用程序提供了逃生功能,以緩解過渡期。

通過向AndroidManifest.xml文件添加以下內容來使用轉義AndroidManifest.xml

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

這將為您的應用程序禁用指針標記功能。請注意,這並沒有解決底層代碼的健康問題。這種逃生陰影將在未來的Android版本中消失,因為這種性質的問題將與MTE不兼容。