หน่วยความจำเริ่มต้นเป็นศูนย์

หน่วยความจำที่ไม่มีการกำหนดค่าใน C และ C++ คือสาเหตุที่พบบ่อยของปัญหาด้านความเสถียร ข้อบกพร่องด้านความปลอดภัยของหน่วยความจำ และการรั่วไหลของข้อมูล เพื่อหลีกเลี่ยงปัญหาเหล่านี้ Android เริ่มต้นหน่วยความจำให้ได้มากที่สุด

หน่วยความจำพื้นที่ผู้ใช้เริ่มต้นเป็นศูนย์

สแต็กหน่วยความจำเริ่มต้นเป็น 0 ตั้งแต่ Android 12 ในโค้ดดั้งเดิมของแพลตฟอร์มทั้งหมด (รวมถึง JNI) และหน่วยความจำฮีปเป็น 0 เริ่มต้นในกระบวนการดั้งเดิมของแพลตฟอร์มทั้งหมด (เช่น netd) แต่ไม่อยู่ในzygoteหรือในแอป

แอปบุคคลที่หนึ่งและบุคคลที่สามที่สร้างด้วย NDK แนะนำให้ใช้แฟล็กคอมไพเลอร์ -ftrivial-auto-var-init=zero เพื่อกำหนดค่าเริ่มต้นของสแต็กในเครื่องเป็น 0 ตัวแปร คอมไพเลอร์จะลดจำนวน 0 ที่ไม่จำเป็นออก เช่น เมื่อตัวแปรภายในเริ่มต้นอย่างชัดเจน (เช่น ตัวแปร int x = 123; x เริ่มต้นเพียงครั้งเดียว) ในกรณีที่โปรแกรมมีสแต็กบัฟเฟอร์ขนาดใหญ่ในประสิทธิภาพ ฮอตสปอต นักพัฒนาซอฟต์แวร์สามารถปิดใช้งานการเริ่มต้นโดยใช้คอมไพเลอร์ แอตทริบิวต์:

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

นอกจากนี้ แอปยังเลือกใช้การเริ่มต้นใช้งานฮีป Zero ได้โดยใช้ แอตทริบิวต์ไฟล์ Manifest android:nativeHeapZeroInitialized หรือจะควบคุมการเริ่มต้นฮีป Zero ขณะรันไทม์ก็ได้ กับ

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 ดูข้อมูลที่นี่