從 Android 11 開始,針對 64 位元程序,所有堆積分配量都會 針對具有 針對 ARM Top-byte Ignore (TBI) 的核心支援。修改這個項目的所有應用程式 代碼終止時,代碼就會終止。此為必要步驟 ,供日後支援 ARM Memory Tagging Extension (MTE) 的硬體使用。
頂層位元組忽略
所有 Armv8 AArch64 硬體中的 64 位元程式碼都支援 ARM 的頂層忽略功能。 此功能表示,當呼叫器故障時,硬體會忽略指標的頂層位元組 存取記憶體。
TBI 須搭配相容的 核心,能正確處理從使用者空間傳遞的標記指標。 Android 通用核心版本 4.14 (Pixel 4) 及以上版本的 Android 常見核心,具備必要的 TBI 功能 修補程式。
如果裝置搭載 TBI 支援,即可在以下位置動態偵測: 程序開始時間,並將導入相關代碼插入頂端 所有堆積分配量的指標位元組。此後,系統會檢查 確保在分配記憶體時,標記不會遭到截斷。
Memory Tagging Extension 完備性
ARM 的 Memory Tagging Extension (MTE) 可協助解決記憶體安全問題。MTE 運作方式是標記每個記憶體的第 56 至 59 個位址位元 分配給堆疊、堆積和全域性硬體和指令集 自動檢查每次存取記憶體時,使用的標記是否正確。
錯誤儲存在 指標保證在支援 MTE 的裝置上不會中斷。 標記指標有助於偵測及拒絕未正確使用頂層項目的方式 MTE 裝置推出前指標的位元組。
開發人員支援
如果應用程式當機,且系統顯示這個連結提示,可能代表 下列其中一項:
- 應用程式嘗試釋出未分配到的指標 是系統堆積分配器
- 您應用程式中的某些內容修改了指標的頂層位元組。頂層位元組 無法修改指標,您需要修改程式碼才能解決這個問題 問題。
錯誤使用或修改的頂層位元組指標範例。
- 特定類型的指標會儲存應用程式專屬的中繼資料 頂端 16 位址位元中的檔案。
- 指標會投放至雙精度浮點數再轉換,同時遺失較低的位址位元。
- 計算本機變數位址之間差異的程式碼 偵測循環深度。
有些應用程式可能會依賴程式庫,
已設定指標的頂層位元組。我們瞭解
快速修正程式庫中的這些基礎問題並不容易。因此
使用 targetSdkLevel < 30
的應用程式
系統不會預設啟用指標標記。我們也提供 Esc 鍵
使用 targetSdkLevel >= 30
建構的應用程式交流互動
來縮短過渡期
將下列程式碼加進您的
AndroidManifest.xml
檔案:
<application android:allowNativeHeapPointerTagging="false"> ... </application>
這樣會停用 應用程式。這種做法「無法」處理 根本程式碼健康狀態問題這個逃脫接頭將在未來消失 因為這類問題與 Android 版本不相容 MTE。