कंस्ट्रेंट

एक .dex फ़ाइल डेलविक बाइटकोड के लिए परिवहन प्रारूप है। किसी फ़ाइल के वैध .dex फ़ाइल होने के लिए कुछ वाक्यात्मक और अर्थ संबंधी बाधाएँ हैं, और केवल मान्य .dex फ़ाइलों का समर्थन करने के लिए रनटाइम की आवश्यकता होती है।

सामान्य .dex अखंडता बाधाएँ

सामान्य अखंडता बाधाएं .dex फ़ाइल की बड़ी संरचना से संबंधित हैं, जैसा कि .dex प्रारूप में विस्तार से वर्णित है।

पहचानकर्ता विवरण
जी1 .dex फ़ाइल का magic नंबर dex\n035\0 या dex\n037\0 होना चाहिए।
जी2 चेकसम magic और checksum फ़ील्ड को छोड़कर संपूर्ण फ़ाइल सामग्री का एडलर-32 चेकसम होना चाहिए।
जी3 हस्ताक्षर magic , checksum और signature छोड़कर संपूर्ण फ़ाइल सामग्री का SHA-1 हैश होना चाहिए।
जी -4 file_size बाइट्स में वास्तविक फ़ाइल आकार से मेल खाना चाहिए।
जी5 header_size मान होना चाहिए: 0x70
जी6 endian_tag मान या तो होना चाहिए: ENDIAN_CONSTANT या REVERSE_ENDIAN_CONSTANT
जी7 प्रत्येक link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs और data अनुभागों के लिए, offset और size फ़ील्ड या तो शून्य या दोनों गैर-शून्य होने चाहिए। बाद वाले मामले में, ऑफसेट चार-बाइट-संरेखित होना चाहिए।
जी -8 हेडर में map_off को छोड़कर सभी ऑफ़सेट फ़ील्ड चार-बाइट-संरेखित होने चाहिए।
जी9 map_off फ़ील्ड या तो शून्य होनी चाहिए या डेटा अनुभाग में इंगित होनी चाहिए। बाद वाले मामले में, data अनुभाग मौजूद होना चाहिए।
जी10 कोई भी link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs और data अनुभाग एक-दूसरे या हेडर को ओवरलैप नहीं करना चाहिए।
जी11 यदि कोई मानचित्र मौजूद है, तो प्रत्येक मानचित्र प्रविष्टि का एक वैध प्रकार होना चाहिए। प्रत्येक प्रकार अधिकतम एक बार प्रकट हो सकता है।
जी12 यदि कोई मानचित्र मौजूद है, तो प्रत्येक मानचित्र प्रविष्टि में एक गैर-शून्य ऑफसेट और आकार होना चाहिए। ऑफसेट को फ़ाइल के संबंधित अनुभाग में इंगित करना चाहिए (यानी एक string_id_item string_ids अनुभाग में इंगित करना चाहिए) और आइटम का स्पष्ट या अंतर्निहित आकार अनुभाग की वास्तविक सामग्री और आकार से मेल खाना चाहिए।
जी13 यदि कोई मानचित्र मौजूद है, तो मानचित्र प्रविष्टि n+1 का ऑफसेट मानचित्र प्रविष्टि n plus than size of map entry n से अधिक या बराबर होना चाहिए। इसका तात्पर्य गैर-अतिव्यापी प्रविष्टियाँ और निम्न-से-उच्च ऑर्डरिंग है।
जी14 निम्नलिखित प्रकार की प्रविष्टियों में एक ऑफसेट होना चाहिए जो चार-बाइट-संरेखित हो: string_id_item , type_id_item , proto_id_item , field_id_item , method_id_item , class_def_item , type_list , code_item , annotations_directory_item
जी15 प्रत्येक string_id_item के लिए, string_data_off फ़ील्ड में data अनुभाग में एक वैध संदर्भ होना चाहिए। संदर्भित string_data_item के लिए, data फ़ील्ड में एक वैध MUTF-8 स्ट्रिंग होनी चाहिए, और utf16_size स्ट्रिंग की डिकोड की गई लंबाई से मेल खाना चाहिए।
जी16 प्रत्येक type_id_item के लिए, descriptor_idx फ़ील्ड में string_ids सूची में एक वैध संदर्भ होना चाहिए। संदर्भित स्ट्रिंग एक वैध प्रकार का वर्णनकर्ता होना चाहिए।
जी17 प्रत्येक proto_id_item के लिए, shorty_idx फ़ील्ड में string_ids सूची में एक वैध संदर्भ होना चाहिए। संदर्भित स्ट्रिंग एक वैध शॉर्टी डिस्क्रिप्टर होनी चाहिए। साथ ही, return_type_idx फ़ील्ड को type_ids अनुभाग में एक वैध सूचकांक होना चाहिए, और parameters_off फ़ील्ड या तो शून्य होना चाहिए या data अनुभाग में इंगित करने वाला एक वैध ऑफ़सेट होना चाहिए। यदि गैर-शून्य है, तो पैरामीटर सूची में कोई शून्य प्रविष्टियाँ नहीं होनी चाहिए।
जी18 प्रत्येक field_id_item के लिए, class_idx और type_idx दोनों फ़ील्ड type_ids सूची में मान्य सूचकांक होने चाहिए। class_idx द्वारा संदर्भित प्रविष्टि एक गैर-सरणी संदर्भ प्रकार होनी चाहिए। इसके अलावा, name_idx फ़ील्ड string_ids अनुभाग में एक वैध संदर्भ होना चाहिए, और संदर्भित प्रविष्टि की सामग्री MemberName विनिर्देश के अनुरूप होनी चाहिए।
जी19 प्रत्येक method_id_item के लिए, class_idx फ़ील्ड को type_ids अनुभाग में एक मान्य अनुक्रमणिका होना चाहिए, और संदर्भित प्रविष्टि एक गैर-सरणी संदर्भ प्रकार होनी चाहिए। proto_id फ़ील्ड proto_ids सूची में एक वैध संदर्भ होना चाहिए। name_idx फ़ील्ड string_ids अनुभाग में एक वैध संदर्भ होना चाहिए, और संदर्भित प्रविष्टि की सामग्री MemberName विनिर्देश के अनुरूप होनी चाहिए।
जी -20 प्रत्येक field_id_item के लिए, class_idx फ़ील्ड type_ids सूची में एक मान्य अनुक्रमणिका होनी चाहिए। संदर्भित प्रविष्टि एक गैर-सरणी संदर्भ प्रकार होनी चाहिए।

स्थैतिक बाइटकोड बाधाएँ

स्थैतिक बाधाएं बाइटकोड के व्यक्तिगत तत्वों पर बाधाएं हैं। इन्हें आमतौर पर नियंत्रण या डेटा-प्रवाह विश्लेषण तकनीकों का उपयोग किए बिना जांचा जा सकता है।

पहचानकर्ता विवरण
ए 1 insns ऐरे खाली नहीं होना चाहिए.
ए2 insns ऐरे में पहले ऑपकोड में इंडेक्स शून्य होना चाहिए।
ए3 insns ऐरे में केवल वैध डाल्विक ऑपकोड होने चाहिए।
ए4 निर्देश का सूचकांक n+1 संभावित ऑपरेंड को ध्यान में रखते हुए, निर्देश के सूचकांक n और निर्देश n की लंबाई के बराबर होना चाहिए।
ए5 insns सरणी में अंतिम निर्देश इंडेक्स insns_size-1 पर समाप्त होना चाहिए।
ए6 सभी goto और if-<kind> लक्ष्य एक ही विधि के अंतर्गत ऑपकोड होने चाहिए।
ए7 packed-switch निर्देश के सभी लक्ष्य एक ही विधि के भीतर ऑपकोड होने चाहिए। लक्ष्यों का आकार और सूची सुसंगत होनी चाहिए.
ए8 sparse-switch निर्देश के सभी लक्ष्य एक ही विधि के भीतर ऑपकोड होने चाहिए। संबंधित तालिका सुसंगत होनी चाहिए और निम्न-से-उच्च क्रमबद्ध होनी चाहिए।
ए9 const-string और const-string/jumbo निर्देशों का B ऑपरेंड स्ट्रिंग स्थिरांक पूल में एक वैध इंडेक्स होना चाहिए।
ए10 iget<kind> और iput<kind> निर्देशों का C ऑपरेंड फ़ील्ड स्थिरांक पूल में एक वैध सूचकांक होना चाहिए। संदर्भित प्रविष्टि को एक इंस्टेंस फ़ील्ड का प्रतिनिधित्व करना चाहिए।
ए11 sget<kind> और sput<kind> निर्देशों का C ऑपरेंड फ़ील्ड स्थिरांक पूल में एक वैध सूचकांक होना चाहिए। संदर्भित प्रविष्टि को एक स्थिर फ़ील्ड का प्रतिनिधित्व करना चाहिए।
ए12 invoke-virtual , invoke-super , invoke-direct और invoke-static निर्देशों का C ऑपरेंड विधि स्थिरांक पूल में एक वैध सूचकांक होना चाहिए।
ए 13 invoke-virtual/range , invoke-super/range , invoke-direct/range और invoke-static/range निर्देशों का B ऑपरेंड विधि स्थिरांक पूल में एक वैध सूचकांक होना चाहिए।
ए 14 एक विधि जिसका नाम '<' से शुरू होता है, उसे केवल वीएम द्वारा ही लागू किया जाना चाहिए, न कि .dex फ़ाइल से उत्पन्न कोड द्वारा। एकमात्र अपवाद इंस्टेंस इनिशियलाइज़र है, जिसे invoke-direct द्वारा लागू किया जा सकता है।
ए15 invoke-interface निर्देश का C ऑपरेंड विधि स्थिरांक पूल में एक वैध सूचकांक होना चाहिए। संदर्भित method_id एक इंटरफ़ेस से संबंधित होना चाहिए (क्लास नहीं)।
ए16 invoke-interface/range निर्देश का B ऑपरेंड विधि स्थिरांक पूल में एक वैध सूचकांक होना चाहिए। संदर्भित method_id एक इंटरफ़ेस से संबंधित होना चाहिए (क्लास नहीं)।
ए17 const-class , check-cast , new-instance और filled-new-array/range निर्देशों का B ऑपरेंड टाइप कॉन्स्टेंट पूल में एक वैध इंडेक्स होना चाहिए।
ए18 instance-of , new-array , और filled-new-array निर्देशों का C ऑपरेंड टाइप कॉन्स्टैंट पूल में एक वैध इंडेक्स होना चाहिए।
ए19 new-array निर्देश द्वारा बनाई गई सरणी का आयाम 256 से कम होना चाहिए।
ए20 new निर्देश में सरणी वर्ग, इंटरफ़ेस या अमूर्त वर्ग का उल्लेख नहीं होना चाहिए।
ए21 new-array निर्देश द्वारा संदर्भित प्रकार एक वैध, गैर-संदर्भ प्रकार होना चाहिए।
ए22 एकल-चौड़ाई (गैर-जोड़ी) फैशन में निर्देश द्वारा संदर्भित सभी रजिस्टर वर्तमान पद्धति के लिए मान्य होने चाहिए। अर्थात्, उनके सूचकांक गैर-नकारात्मक और registers_size से छोटे होने चाहिए।
ए23 किसी निर्देश द्वारा दोगुनी-चौड़ाई (जोड़ी) शैली में संदर्भित सभी रजिस्टर वर्तमान पद्धति के लिए मान्य होने चाहिए। अर्थात्, उनके सूचकांक गैर-नकारात्मक और registers_size-1 से छोटे होने चाहिए।
ए 24 invoke-virtual और invoke-direct निर्देशों का method_id ऑपरेंड एक क्लास से संबंधित होना चाहिए (इंटरफ़ेस नहीं)। संस्करण 037 से पहले की डेक्स फ़ाइलों में invoke-super और invoke-static निर्देशों के लिए भी यही सच होना चाहिए।
ए25 invoke-virtual/range और invoke-direct/range निर्देशों का method_id ऑपरेंड एक क्लास से संबंधित होना चाहिए (इंटरफ़ेस नहीं)। संस्करण 037 से पहले की डेक्स फ़ाइलों में invoke-super/range और invoke-static/range निर्देशों के लिए भी यही सच होना चाहिए।

संरचनात्मक बाइटकोड बाधाएँ

संरचनात्मक बाधाएं बायटेकोड के कई तत्वों के बीच संबंधों पर बाधाएं हैं। इन्हें आम तौर पर नियंत्रण या डेटा-प्रवाह विश्लेषण तकनीकों को नियोजित किए बिना जांचा नहीं जा सकता है।

पहचानकर्ता विवरण
बी 1 तर्कों की संख्या और प्रकार (रजिस्टर और तत्काल मान) हमेशा निर्देश से मेल खाने चाहिए।
बी2 रजिस्टर जोड़ियों को कभी नहीं तोड़ना चाहिए।
बी 3 एक रजिस्टर (या जोड़ी) को पढ़ने से पहले उसे सौंपा जाना चाहिए।
बी 4 एक invoke-direct निर्देश को केवल मौजूदा क्लास या उसके सुपरक्लास में से एक इंस्टेंस इनिशियलाइज़र या एक विधि को इनवॉइस करना चाहिए।
बी5 एक इंस्टेंस इनिशियलाइज़र को केवल एक अप्रारंभीकृत इंस्टेंस पर ही लागू किया जाना चाहिए।
बी -6 इंस्टेंस विधियों को केवल तभी लागू किया जा सकता है और इंस्टेंस फ़ील्ड को केवल पहले से आरंभ किए गए इंस्टेंस पर ही एक्सेस किया जा सकता है।
बी 7 एक रजिस्टर जिसमें new-instance निर्देश का परिणाम होता है, उसका उपयोग नहीं किया जाना चाहिए यदि उसी new-instance निर्देश को इंस्टेंस आरंभ होने से पहले फिर से निष्पादित किया जाता है।
बी8 किसी भी इंस्टेंस सदस्य तक पहुंचने से पहले एक इंस्टेंस इनिशियलाइज़र को दूसरे इंस्टेंस इनिशियलाइज़र (समान क्लास या सुपरक्लास) को कॉल करना होगा। अपवाद गैर-विरासत में मिले इंस्टेंस फ़ील्ड हैं, जिन्हें किसी अन्य इनिशियलाइज़र और सामान्य रूप से Object क्लास को कॉल करने से पहले असाइन किया जा सकता है।
बी9 सभी वास्तविक विधि तर्क उनके संबंधित औपचारिक तर्कों के साथ असाइनमेंट-संगत होने चाहिए।
बी10 प्रत्येक उदाहरण विधि मंगलाचरण के लिए, वास्तविक उदाहरण निर्देश में निर्दिष्ट वर्ग या इंटरफ़ेस के साथ असाइनमेंट-संगत होना चाहिए।
बी11 एक return<kind> निर्देश को उसकी विधि के रिटर्न प्रकार से मेल खाना चाहिए।
बी 12 सुपरक्लास के संरक्षित सदस्यों तक पहुँचने पर, एक्सेस किए जाने वाले उदाहरण का वास्तविक प्रकार या तो वर्तमान वर्ग या उसके उपवर्गों में से एक होना चाहिए।
बी13 स्थिर फ़ील्ड में संग्रहीत मान का प्रकार फ़ील्ड के प्रकार के साथ असाइनमेंट-संगत या परिवर्तनीय होना चाहिए।
बी14 किसी फ़ील्ड में संग्रहीत मान का प्रकार फ़ील्ड के प्रकार के साथ असाइनमेंट-संगत या परिवर्तनीय होना चाहिए।
बी15 किसी सरणी में संग्रहीत प्रत्येक मान का प्रकार सरणी के घटक प्रकार के साथ असाइनमेंट-संगत होना चाहिए।
बी16 throw निर्देश का A ऑपरेंड java.lang.Throwable के साथ असाइनमेंट-संगत होना चाहिए।
बी17 किसी विधि का अंतिम पहुंच योग्य निर्देश या तो बैकवर्ड goto या शाखा, return या throw निर्देश होना चाहिए। insns ऐरे को नीचे छोड़ना संभव नहीं होना चाहिए।
बी18 पूर्व रजिस्टर जोड़ी के अनअसाइन किए गए आधे हिस्से को तब तक नहीं पढ़ा जा सकता (अमान्य माना जाता है) जब तक इसे किसी अन्य निर्देश द्वारा दोबारा असाइन नहीं किया गया हो।
बी19 एक move-result<kind> निर्देश के ठीक पहले ( insns सरणी में) एक invoke-<kind> निर्देश होना चाहिए। एकमात्र अपवाद move-result-object निर्देश है, जिसके पहले एक filled-new-array निर्देश भी हो सकता है।
बी20 एक move-result<kind> निर्देश के तुरंत पहले (वास्तविक नियंत्रण प्रवाह में) एक मिलान return-<kind> निर्देश होना चाहिए (इस पर छलांग नहीं लगाई जानी चाहिए)। एकमात्र अपवाद move-result-object निर्देश है, जिसके पहले एक filled-new-array निर्देश भी हो सकता है।
बी21 एक move-exception निर्देश केवल अपवाद हैंडलर में पहले निर्देश के रूप में दिखना चाहिए।
बी22 packed-switch-data , sparse-switch-data , और fill-array-data छद्म निर्देश नियंत्रण प्रवाह द्वारा पहुंच योग्य नहीं होने चाहिए।