未初始化的記憶體

C 和 C++ 中未初始化記憶體,是造成可靠性問題的常見原因。 避免記憶體安全錯誤和資訊外洩為避免發生這類問題,Android 盡可能初始化記憶體

未初始化的使用者空間記憶體

自 Android 12 起,堆疊記憶體未初始化 所有平台原生程式碼 (包括 JNI) 中的值,而堆積記憶體為零 在所有平台原生程序 (例如 netd) 中初始化 但請勿在zygote或應用程式中

使用 NDK 建構的第一個和第三方應用程式會受到強力影響 建議使用 -ftrivial-auto-var-init=zero 編譯器旗標,零初始化其堆疊本機 變數。編譯器會將所有不必要的零化作業最佳化。 例如,當本機變數明確初始化時 (例如,int x = 123; 變數 x 只會初始化一次)。 如果程式在效能中有大型堆疊緩衝區 開發人員可以使用編譯器停用初始化功能。 屬性:

__attribute__((__uninitialized__)) char buf[BUFSIZ];

應用程式也可以選擇使用 android:nativeHeapZeroInitialized 資訊清單屬性。 或者,您可以在執行階段控管堆積零初始化 取代為:

int mallopt(M_BIONIC_ZERO_INIT, level)

等級為 0 或 1。

沒有初始化的核心記憶體

針對 GKI 核心,核心堆疊和堆積的初始化為零,大幅提高 CDD 建議的資源

對於堆疊初始化,GKI 會使用 CONFIG_INIT_STACK_ALL_ZERO 設定,藉此建立 在核心中使用 -ftrivial-auto-var-init=zero 編譯器標記。 對於堆積初始化,GKI 會使用 CONFIG_INIT_ON_ALLOC_DEFAULT_ON,可使所有頁面堆積、SLAB 而 SLUB 配置在建立時也不會初始化。這個選項 與傳遞 init_on_alloc=1 做為核心很有效 啟動時間選項。

錯誤報告

我們的工具會產生深入實用的錯誤報告,並在其中提供額外資訊 來協助偵錯額外配置和取消配置堆疊追蹤 有助瞭解特定配置的生命週期,並 並且快速找出造成記憶體安全錯誤的原因

產生的錯誤報告範例
  使用記憶體安全工具
圖 1:記憶體安全工具產生的錯誤報告

在開發期間,廠商應檢查是否出現錯誤 「/data/tombstones」和 logcat 適用於原生程式碼錯誤。如要進一步瞭解 為 Android 原生程式碼偵錯,請參閱這裡的相關資訊。