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
做為核心很有效
啟動時間選項。
錯誤報告
我們的工具會產生深入實用的錯誤報告,並在其中提供額外資訊 來協助偵錯額外配置和取消配置堆疊追蹤 有助瞭解特定配置的生命週期,並 並且快速找出造成記憶體安全錯誤的原因
在開發期間,廠商應檢查是否出現錯誤
「/data/tombstones
」和
logcat
適用於原生程式碼錯誤。如要進一步瞭解
為 Android 原生程式碼偵錯,請參閱這裡的相關資訊。