সীমাবদ্ধতা

একটি .dex ফাইল হল ডালভিক বাইটকোডের পরিবহন বিন্যাস। একটি ফাইল একটি বৈধ .dex ফাইল হওয়ার জন্য কিছু সিনট্যাক্টিক্যাল এবং শব্দার্থিক সীমাবদ্ধতা রয়েছে এবং শুধুমাত্র বৈধ .dex ফাইল সমর্থন করার জন্য একটি রানটাইম প্রয়োজন।

সাধারণ .dex অখণ্ডতার সীমাবদ্ধতা

সাধারণ অখণ্ডতার সীমাবদ্ধতাগুলি একটি .dex ফাইলের বৃহত্তর কাঠামোর সাথে সম্পর্কিত, যেমনটি .dex বিন্যাসে বিস্তারিতভাবে বর্ণিত হয়েছে।

শনাক্তকারী বর্ণনা
জি 1 .dex ফাইলের magic নম্বর অবশ্যই dex\n035\0 বা dex\n037\0 হতে হবে।
জি 2 চেকসামটি অবশ্যই magic এবং checksum ক্ষেত্র ছাড়া পুরো ফাইলের বিষয়বস্তুর একটি অ্যাডলার-32 চেকসাম হতে হবে।
G3 স্বাক্ষরটি অবশ্যই magic , checksum এবং signature ব্যতীত পুরো ফাইলের বিষয়বস্তুর একটি SHA-1 হ্যাশ হতে হবে।
G4 file_size অবশ্যই বাইটে প্রকৃত ফাইলের আকারের সাথে মিলবে।
G5 header_size মান থাকতে হবে: 0x70
G6 endian_tag এর মান অবশ্যই থাকতে হবে: ENDIAN_CONSTANT বা REVERSE_ENDIAN_CONSTANT
G7 প্রতিটি link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs , এবং data বিভাগগুলির জন্য, offset এবং size ক্ষেত্র অবশ্যই শূন্য বা উভয়ই নন-শূন্য হতে হবে। পরবর্তী ক্ষেত্রে, অফসেটটি চার-বাইট-সারিবদ্ধ হতে হবে।
G8 map_off ছাড়া হেডারের সমস্ত অফসেট ক্ষেত্র অবশ্যই চার-বাইট-সারিবদ্ধ হতে হবে।
G9 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 বিভাগে নির্দেশ করতে হবে) এবং আইটেমের স্পষ্ট বা অন্তর্নিহিত আকার অবশ্যই অংশের প্রকৃত বিষয়বস্তু এবং আকারের সাথে মিলবে।
G13 যদি একটি মানচিত্র বিদ্যমান থাকে, তাহলে মানচিত্র এন্ট্রি 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 অবশ্যই স্ট্রিংটির ডিকোড করা দৈর্ঘ্যের সাথে মেলে।
G16 প্রতিটি 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 স্পেসিফিকেশনের সাথে সঙ্গতিপূর্ণ হতে হবে।
G19 প্রতিটি method_id_item এর জন্য, class_idx ক্ষেত্রটি type_ids বিভাগে একটি বৈধ সূচী হতে হবে এবং উল্লেখিত এন্ট্রিটি অবশ্যই একটি নন-অ্যারে রেফারেন্স টাইপ হতে হবে। proto_id ক্ষেত্রটি অবশ্যই proto_ids তালিকার একটি বৈধ রেফারেন্স হতে হবে। name_idx ক্ষেত্রটি string_ids বিভাগে একটি বৈধ রেফারেন্স হতে হবে এবং উল্লেখিত এন্ট্রির বিষয়বস্তু অবশ্যই MemberName স্পেসিফিকেশনের সাথে সঙ্গতিপূর্ণ হতে হবে।
G20 প্রতিটি field_id_item জন্য, class_idx ক্ষেত্রটি type_ids তালিকায় একটি বৈধ সূচক হতে হবে। উল্লেখিত এন্ট্রি একটি নন-অ্যারে রেফারেন্স টাইপ হতে হবে।

স্ট্যাটিক বাইটকোড সীমাবদ্ধতা

স্ট্যাটিক সীমাবদ্ধতা বাইটকোডের পৃথক উপাদানের সীমাবদ্ধতা। এগুলি সাধারণত নিয়ন্ত্রণ বা ডেটা-প্রবাহ বিশ্লেষণ কৌশল ব্যবহার না করেই পরীক্ষা করা যেতে পারে।

শনাক্তকারী বর্ণনা
A1 insns অ্যারে খালি হওয়া উচিত নয়।
A2 insns অ্যারের প্রথম অপকোডে অবশ্যই সূচক শূন্য থাকতে হবে।
A3 insns অ্যারেতে শুধুমাত্র বৈধ ডালভিক অপকোড থাকতে হবে।
A4 নির্দেশের সূচী n+1 অবশ্যই নির্দেশের সূচী n এবং নির্দেশের দৈর্ঘ্য n এর সমান হতে হবে, সম্ভাব্য অপারেন্ডগুলি বিবেচনা করে।
A5 insns অ্যারের শেষ নির্দেশ অবশ্যই index insns_size-1 এ শেষ হবে।
A6 সমস্ত goto এবং if-<kind> লক্ষ্য একই পদ্ধতির মধ্যে opcode হতে হবে।
A7 একটি packed-switch নির্দেশের সমস্ত লক্ষ্য অবশ্যই একই পদ্ধতির মধ্যে অপকোড হতে হবে। আকার এবং লক্ষ্য তালিকা সামঞ্জস্যপূর্ণ হতে হবে.
A8 একটি sparse-switch নির্দেশের সমস্ত লক্ষ্য অবশ্যই একই পদ্ধতির মধ্যে অপকোড হতে হবে। সংশ্লিষ্ট টেবিলটি অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে এবং নিম্ন-থেকে-উচ্চের মধ্যে সাজানো হবে।
A9 const-string এবং const-string/jumbo নির্দেশাবলীর B অপারেন্ড অবশ্যই স্ট্রিং ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে।
A10 iget<kind> এবং iput<kind> নির্দেশাবলীর C অপারেন্ড অবশ্যই ক্ষেত্রের ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে। উল্লেখিত এন্ট্রি একটি উদাহরণ ক্ষেত্র প্রতিনিধিত্ব করা আবশ্যক.
A11 sget<kind> এবং sput<kind> নির্দেশাবলীর C অপারেন্ড অবশ্যই ক্ষেত্রের ধ্রুবক পুলে একটি বৈধ সূচক হতে হবে। উল্লেখিত এন্ট্রি অবশ্যই একটি স্থির ক্ষেত্রের প্রতিনিধিত্ব করবে।
A12 invoke-virtual , invoke-super , invoke-direct এবং invoke-static নির্দেশাবলীর C অপারেন্ড অবশ্যই মেথড কনস্ট্যান্ট পুলের একটি বৈধ সূচক হতে হবে।
A13 invoke-virtual/range , invoke-super/range , invoke-direct/range , এবং invoke-static/range নির্দেশাবলীর B অপারেন্ড অবশ্যই পদ্ধতি ধ্রুবক পুলে একটি বৈধ সূচক হতে হবে।
A14 একটি পদ্ধতি যার নাম একটি '<' দিয়ে শুরু হয় তা শুধুমাত্র VM দ্বারা নিহিতভাবে আহ্বান করতে হবে, একটি .dex ফাইল থেকে উদ্ভূত কোড দ্বারা নয়। একমাত্র ব্যতিক্রম হল ইনস্ট্যান্স ইনিশিয়ালাইজার, যা invoke-direct দ্বারা আহ্বান করা যেতে পারে।
A15 invoke-interface নির্দেশের C অপারেন্ড অবশ্যই পদ্ধতি ধ্রুবক পুলে একটি বৈধ সূচক হতে হবে। উল্লেখিত method_id অবশ্যই একটি ইন্টারফেসের অন্তর্গত (কোন শ্রেণী নয়)।
A16 invoke-interface/range নির্দেশনার B অপারেন্ড অবশ্যই পদ্ধতি ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে। উল্লেখিত method_id অবশ্যই একটি ইন্টারফেসের অন্তর্গত (কোন শ্রেণী নয়)।
A17 const-class , check-cast , new-instance , এবং filled-new-array/range নির্দেশাবলীর B অপারেন্ড টাইপ ধ্রুবক পুলের মধ্যে একটি বৈধ সূচক হতে হবে।
A18 instance-of , new-array , এবং filled-new-array নির্দেশাবলীর C অপারেন্ড অবশ্যই টাইপ ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে।
A19 একটি new-array নির্দেশ দ্বারা তৈরি একটি অ্যারের মাত্রা অবশ্যই 256 এর কম হতে হবে।
A20 new নির্দেশ অবশ্যই অ্যারে ক্লাস, ইন্টারফেস বা বিমূর্ত ক্লাস উল্লেখ করবে না।
A21 একটি new-array নির্দেশ দ্বারা উল্লেখিত প্রকারটি অবশ্যই একটি বৈধ, নন-রেফারেন্স টাইপ হতে হবে।
A22 একক-প্রস্থ (নন-পেয়ার) ফ্যাশনে একটি নির্দেশ দ্বারা উল্লেখ করা সমস্ত রেজিস্টার বর্তমান পদ্ধতির জন্য বৈধ হতে হবে। অর্থাৎ, তাদের সূচকগুলি অবশ্যই নেতিবাচক এবং registers_size থেকে ছোট হতে হবে।
A23 একটি দ্বিগুণ-প্রস্থ (জোড়া) ফ্যাশনে একটি নির্দেশ দ্বারা উল্লেখ করা সমস্ত রেজিস্টার বর্তমান পদ্ধতির জন্য বৈধ হতে হবে। অর্থাৎ, তাদের সূচকগুলি অবশ্যই নেতিবাচক এবং registers_size-1 এর চেয়ে ছোট হতে হবে।
A24 invoke-virtual এবং invoke-direct নির্দেশাবলীর method_id অপারেন্ড অবশ্যই একটি ক্লাসের অন্তর্গত (কোন ইন্টারফেস নয়)। ভার্সন 037 এর আগের ডেক্স ফাইলগুলিতে invoke-super এবং invoke-static নির্দেশাবলীর ক্ষেত্রেও এটি সত্য হতে হবে।
A25 invoke-virtual/range এবং invoke-direct/range নির্দেশাবলীর method_id অপারেন্ড অবশ্যই একটি ক্লাসের অন্তর্গত (কোন ইন্টারফেস নয়)। 037 সংস্করণের পূর্বের ডেক্স ফাইলগুলিতে invoke-super/range এবং invoke-static/range নির্দেশাবলীর ক্ষেত্রেও এটি সত্য হতে হবে।

স্ট্রাকচারাল বাইটকোড সীমাবদ্ধতা

কাঠামোগত সীমাবদ্ধতা বাইটকোডের বিভিন্ন উপাদানের মধ্যে সম্পর্কের সীমাবদ্ধতা। এগুলি সাধারণত নিয়ন্ত্রণ বা ডেটা-প্রবাহ বিশ্লেষণ কৌশল ব্যবহার না করে পরীক্ষা করা যায় না।

শনাক্তকারী বর্ণনা
B1 আর্গুমেন্টের সংখ্যা এবং প্রকারগুলি (রেজিস্টার এবং তাত্ক্ষণিক মান) সর্বদা নির্দেশের সাথে মেলে।
B2 রেজিস্টার জোড়া কখনই ভেঙ্গে যাবে না।
B3 এটি পড়ার আগে একটি রেজিস্টার (বা জোড়া) প্রথমে বরাদ্দ করতে হবে।
B4 একটি invoke-direct ইন্সট্রাকশন অবশ্যই একটি ইনস্ট্যান্স ইনিশিয়ালাইজার বা একটি মেথড চালু করতে হবে শুধুমাত্র বর্তমান ক্লাসে বা তার সুপারক্লাসগুলির একটিতে।
B5 একটি ইনস্ট্যান্স ইনিশিয়ালাইজার শুধুমাত্র একটি অপ্রবর্তিত দৃষ্টান্তে আহ্বান করতে হবে।
B6 ইনস্ট্যান্স পদ্ধতি শুধুমাত্র চালু করা যেতে পারে এবং ইনস্ট্যান্স ক্ষেত্রগুলি শুধুমাত্র ইতিমধ্যেই শুরু হওয়া দৃষ্টান্তগুলিতে অ্যাক্সেস করা যেতে পারে।
B7 একটি new-instance নির্দেশের ফলাফল ধারণ করে এমন একটি রেজিস্টার ব্যবহার করা উচিত নয় যদি দৃষ্টান্ত শুরু করার আগে একই new-instance নির্দেশ আবার কার্যকর করা হয়।
B8 একটি ইনস্ট্যান্স ইনিশিয়ালাইজারকে অবশ্যই অন্য ইনস্ট্যান্স ইনিশিয়ালাইজারকে কল করতে হবে (একই ক্লাস বা সুপারক্লাস) কোনো ইনস্ট্যান্স সদস্যদের অ্যাক্সেস করার আগে। ব্যতিক্রম হল নন-ইনহেরিটেড ইনস্ট্যান্স ক্ষেত্র, যা অন্য ইনিশিয়ালাইজার এবং সাধারণভাবে Object ক্লাস কল করার আগে বরাদ্দ করা যেতে পারে।
B9 সমস্ত প্রকৃত পদ্ধতির আর্গুমেন্ট অবশ্যই তাদের নিজ নিজ আনুষ্ঠানিক আর্গুমেন্টের সাথে অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ হতে হবে।
B10 প্রতিটি দৃষ্টান্ত পদ্ধতি আহ্বানের জন্য, প্রকৃত উদাহরণ অবশ্যই নির্দেশে নির্দিষ্ট করা ক্লাস বা ইন্টারফেসের সাথে অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ হতে হবে।
B11 একটি return<kind> নির্দেশ অবশ্যই তার পদ্ধতির রিটার্ন টাইপের সাথে মেলে।
B12 একটি সুপারক্লাসের সুরক্ষিত সদস্যদের অ্যাক্সেস করার সময়, অ্যাক্সেস করা দৃষ্টান্তের প্রকৃত ধরনটি হয় বর্তমান শ্রেণী বা এর একটি উপশ্রেণী হতে হবে।
B13 একটি স্ট্যাটিক ফিল্ডে সংরক্ষিত একটি মানের প্রকার অবশ্যই অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ বা ক্ষেত্রের প্রকারের সাথে পরিবর্তনযোগ্য হতে হবে।
B14 একটি ক্ষেত্রের মধ্যে সংরক্ষিত একটি মানের প্রকার অবশ্যই অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ বা ক্ষেত্রের প্রকারের সাথে পরিবর্তনযোগ্য হতে হবে।
B15 একটি অ্যারেতে সংরক্ষিত প্রতিটি মানের ধরন অবশ্যই অ্যারের উপাদান প্রকারের সাথে অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ হতে হবে।
B16 একটি throw নির্দেশের A অপারেন্ড অবশ্যই java.lang.Throwable এর সাথে অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ হতে হবে।
B17 একটি পদ্ধতির শেষ পৌঁছানোর যোগ্য নির্দেশটি অবশ্যই একটি পিছনের দিকের goto বা শাখা, একটি return , বা একটি throw নির্দেশনা হতে হবে। নীচের অংশে insns অ্যারে ছেড়ে যাওয়া অবশ্যই সম্ভব হবে না।
B18 প্রাক্তন রেজিস্টার জোড়ার অর্পিত অর্ধেক পড়া যাবে না (অবৈধ বলে বিবেচিত) যতক্ষণ না এটি অন্য কোনও নির্দেশ দ্বারা পুনরায় বরাদ্দ করা হয়।
B19 একটি move-result<kind> নির্দেশ অবশ্যই একটি invoke-<kind> নির্দেশ দ্বারা অবিলম্বে ( insns অ্যারেতে) আগে থাকতে হবে। একমাত্র ব্যতিক্রম হল move-result-object নির্দেশনা, যা একটি filled-new-array নির্দেশের আগেও হতে পারে।
B20 একটি move-result<kind> নির্দেশের সাথে সাথেই (প্রকৃত নিয়ন্ত্রণ প্রবাহে) একটি ম্যাচিং return-<kind> নির্দেশের পূর্বে হতে হবে (এতে লাফ দেওয়া উচিত নয়)। একমাত্র ব্যতিক্রম হল move-result-object নির্দেশনা, যা একটি filled-new-array নির্দেশের আগেও হতে পারে।
B21 একটি move-exception নির্দেশ শুধুমাত্র একটি ব্যতিক্রম হ্যান্ডলারে প্রথম নির্দেশ হিসাবে উপস্থিত হওয়া আবশ্যক।
B22 packed-switch-data , sparse-switch-data , এবং fill-array-data ছদ্ম-নির্দেশগুলি নিয়ন্ত্রণ প্রবাহের মাধ্যমে পৌঁছানো উচিত নয়।