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

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.

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

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/tombstoneslogcat đố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.