Bộ nhớ khởi tạo bằng 0

Bộ nhớ chưa được khởi tạo trong C và C++ là nguyên nhân phổ biến gây ra các vấn đề về độ tin cậy, lỗi an toàn bộ nhớ và rò rỉ thông tin. Để tránh những vấn đề này, Android khởi tạo càng nhiều bộ nhớ càng tốt.

Không có bộ nhớ không gian người dùng được khởi tạo

Kể từ Android 12, bộ nhớ ngăn xếp không được khởi tạo trong tất cả mã gốc của nền tảng (bao gồm cả JNI) và bộ nhớ heap không được khởi tạo trong tất cả các quy trình gốc của nền tảng (chẳng hạn như netd trong zygote hoặc trong ứng dụng.

Các ứng dụng của bên thứ nhất và bên thứ ba được xây dựng bằng NDK được khuyến khích sử dụng cờ trình biên dịch -ftrivial-auto-var-init=zero để khởi tạo các biến cục bộ ngăn xếp của chúng bằng 0. Trình biên dịch sẽ tối ưu hóa mọi số 0 không cần thiết. Ví dụ: khi một biến cục bộ được khởi tạo rõ ràng (chẳng hạn như int x = 123; biến x chỉ được khởi tạo một lần). Nếu chương trình có bộ đệm ngăn xếp lớn trong điểm phát sóng hiệu suất, nhà phát triển có thể tắt quá trình khởi tạo bằng thuộc tính trình biên dịch:

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

Các ứng dụng cũng có thể chọn tham gia khởi tạo heap zero bằng cách sử dụng thuộc tính tệp kê khai android:nativeHeapZeroInitialized . Ngoài ra, việc khởi tạo heap zero có thể được kiểm soát trong thời gian chạy bằng:

int mallopt(M_BIONIC_ZERO_INIT, level)

Trong đó cấp độ là 0 hoặc 1.

Không có bộ nhớ kernel khởi tạo

Ngăn xếp hạt nhân và vùng heap không được khởi tạo đối với hạt nhân GKI, điều này được CDD khuyến khích mạnh mẽ .

Để khởi tạo ngăn xếp, GKI sử dụng cấu hình CONFIG_INIT_STACK_ALL_ZERO , dẫn đến việc xây dựng kernel bằng cờ trình biên dịch -ftrivial-auto-var-init=zero . Để khởi tạo vùng heap, GKI sử dụng CONFIG_INIT_ON_ALLOC_DEFAULT_ON , điều này làm cho tất cả phân bổ vùng heap, SLAB và SLUB của trang không được khởi tạo khi chúng được tạo. Tùy chọn này thực sự tương tự như việc chuyển init_on_alloc=1 làm tùy chọn thời gian khởi động kernel.

Báo cáo lỗi

Các công cụ của chúng tôi tạo ra các báo cáo lỗi sâu sắc chứa thông tin bổ sung để hỗ trợ việc gỡ lỗi. Dấu vết ngăn xếp phân bổ và giải phóng bổ sung giúp hiểu rõ hơn về vòng đời của một phân bổ nhất định và dẫn đến các lỗi an toàn bộ nhớ gây ra gốc nhanh hơn nhiều.

Ví dụ về báo cáo lỗi được tạo bởi công cụ an toàn bộ nhớ
Hình 1 : Báo cáo lỗi được tạo bởi các công cụ an toàn bộ nhớ

Trong quá trình phát triển, nhà cung cấp nên giám sát sự hiện diện của lỗi bằng cách kiểm tra /data/tombstoneslogcat để phát hiện các sự cố nguyên gốc. Để biết thêm thông tin về cách gỡ lỗi mã gốc Android, hãy xem thông tin tại đây .