Bộ nhớ chưa 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, các lỗi về an toàn bộ nhớ và rò rỉ thông tin. Để tránh những vấn đề này, Android sẽ khởi chạy càng nhiều bộ nhớ càng tốt.
Không có bộ nhớ không gian người dùng đã khởi tạo
Kể từ Android 12, bộ nhớ ngăn xếp bằng 0 đã khởi động
trong tất cả mã gốc của nền tảng (bao gồm cả JNI) và bộ nhớ vùng nhớ khối xếp bằng 0
được khởi tạo trong tất cả quy trình gốc của nền tảng (chẳng hạn như netd
)
nhưng không phải trong zygote
hoặc trong ứng dụng.
Các ứng dụng bên thứ nhất và ứng dụng bên thứ ba được xây dựng bằng NDK rất mạnh
bạn nên dùng cờ trình biên dịch -ftrivial-auto-var-init=zero
để khởi tạo giá trị bằng 0 cho ngăn xếp cục bộ của chúng
biến. Trình biên dịch tối ưu hoá mọi giá trị 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ư biến int x = 123;
x
chỉ được khởi tạo một lần).
Nếu chương trình có vùng đệm ngăn xếp lớn trong một hiệu suất
điểm phát sóng, nhà phát triển có thể tắt tính năng khởi chạy bằng cách sử dụng trình biên dịch
thuộc tính:
__attribute__((__uninitialized__)) char buf[BUFSIZ];
Các ứng dụng cũng có thể chọn khởi chạy vùng nhớ khối xếp không bằng cách sử dụng
Thuộc tính tệp kê khai android:nativeHeapZeroInitialized
.
Ngoài ra, bạn có thể kiểm soát quy trình khởi chạy vùng nhớ khối xếp trống trong thời gian chạy
bằng:
int mallopt(M_BIONIC_ZERO_INIT, level)
Trong trường hợp cấp là 0 hoặc 1.
Bộ nhớ nhân đã khởi tạo bằng 0
Ngăn xếp hạt nhân và vùng nhớ khối xếp được khởi động bằng 0 cho hạt nhân GKI, điều này đáng kể theo khuyến nghị của CDD.
Để 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 tạo
nhân hệ điều hành bằng cách sử dụng cờ trình biên dịch -ftrivial-auto-var-init=zero
.
Để khởi tạo vùng nhớ khối xếp, GKI sử dụng
CONFIG_INIT_ON_ALLOC_DEFAULT_ON
, tuỳ chọn này tạo vùng nhớ khối xếp trang, SLAB
và các cơ cấu phân bổ SLUB sẽ được khởi tạo bằng 0 khi chúng được tạo. Lựa chọn này là
tương tự hiệu quả với việc truyền init_on_alloc=1
dưới dạng hạt nhân
thời gian khởi động.
Báo cáo lỗi
Công cụ của chúng tôi tạo ra các báo cáo lỗi chi tiết chứa thông tin bổ sung để hỗ trợ 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 mức phân bổ nhất định và dẫn đến gây ra các lỗi an toàn về bộ nhớ nhanh hơn nhiều.
Trong quá trình phát triển, nhà cung cấp nên theo dõi sự hiện diện của lỗi bằng cách kiểm tra
/data/tombstones
và
logcat
đối với các trục trặc mã gốc. Để biết thêm thông tin về
gỡ lỗi mã gốc Android, xem thông tin tại đây.