जीरो इनिशियलाइज़्ड मेमोरी

C और C++ में अप्रारंभीकृत मेमोरी विश्वसनीयता समस्याओं, मेमोरी सुरक्षा बग और सूचना लीक का एक सामान्य कारण है। इन समस्याओं से बचने के लिए, एंड्रॉइड जितना संभव हो उतनी मेमोरी आरंभ करता है।

शून्य आरंभीकृत उपयोक्ता स्थान स्मृति

एंड्रॉइड 12 के बाद से, स्टैक मेमोरी सभी प्लेटफ़ॉर्म नेटिव कोड (जेएनआई सहित) में शून्य इनिशियलाइज़्ड है और हीप मेमोरी सभी प्लेटफ़ॉर्म नेटिव प्रक्रियाओं (जैसे netd ) में शून्य इनिशियलाइज़्ड है, लेकिन zygote या ऐप्स में नहीं।

एनडीके के साथ निर्मित प्रथम और तृतीय-पक्ष अनुप्रयोगों को अपने स्टैक स्थानीय चर को शून्य-प्रारंभ करने के लिए -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 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 जांच करके बग की उपस्थिति की निगरानी करनी चाहिए। एंड्रॉइड नेटिव कोड को डीबग करने के बारे में अधिक जानकारी के लिए यहां जानकारी देखें।