সীমাবদ্ধতা

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

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

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

শনাক্তকারী বর্ণনা
জি 1 .dex ফাইলের magic নম্বর 35 সংস্করণের জন্য dex\n035\0 বা পরবর্তী সংস্করণগুলির জন্য অনুরূপ হতে হবে।
G2 চেকসামটি অবশ্যই magic এবং checksum ক্ষেত্র ছাড়া পুরো ফাইলের বিষয়বস্তুর একটি অ্যাডলার-32 চেকসাম হতে হবে।
G3 স্বাক্ষরটি অবশ্যই magic , checksum এবং signature ব্যতীত পুরো ফাইলের বিষয়বস্তুর একটি SHA-1 হ্যাশ হতে হবে।
G4

file_size অবশ্যই বাইটে প্রকৃত ফাইলের আকারের সাথে মিলবে। (v40 বা তার আগের)

file_size অবশ্যই কন্টেইনারের পরবর্তী শিরোনামের দিকে নির্দেশ করতে হবে, অথবা সাইজিক্যাল ফাইলের (কন্টেইনার) শেষে। যদি এটি পরবর্তী হেডারে নির্দেশ করে, ফাইলের আকার অবশ্যই 4-বাইট সারিবদ্ধ হতে হবে। সমস্ত file_size ক্ষেত্রের যোগফল অবশ্যই container_size সমান হতে হবে। (v41 বা তার পরে)

G5

header_size মান থাকতে হবে: 0x70 (v40 বা তার আগের)

header_size মান থাকতে হবে: 0x78 (v41 বা পরবর্তী)

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 ক্ষেত্র অবশ্যই শূন্য বা উভয়ই নন-শূন্য হতে হবে। পরবর্তী ক্ষেত্রে, অফসেটটি চার-বাইট-সারিবদ্ধ হতে হবে।

offset এবং size ক্ষেত্রগুলি অবশ্যই কন্টেইনারের মধ্যে থাকতে হবে এবং সেগুলিকে সংজ্ঞায়িত করে এমন হেডারের পরে অবস্থিত ডেটা উল্লেখ করতে হবে। (v41 বা তার পরে)

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 বিভাগে একটি বৈধ রেফারেন্স থাকতে হবে। (v40 বা তার আগের)

প্রতিটি string_id_item জন্য, string_data_off ক্ষেত্রটি অবশ্যই কন্টেইনারের মধ্যে একটি অফসেট হতে হবে এবং যে কোনও শিরোনাম যা ট্রাসিটিভভাবে এটি ব্যবহার করে। (v41 বা তার পরে)

রেফারেন্সকৃত string_data_item এর জন্য, data ফিল্ডে অবশ্যই একটি বৈধ MUTF-8 স্ট্রিং থাকতে হবে এবং utf16_size অবশ্যই স্ট্রিংটির ডিকোড করা দৈর্ঘ্যের সাথে মেলে।

G16 প্রতিটি type_id_item এর জন্য, descriptor_idx ক্ষেত্রটিতে string_ids তালিকায় একটি বৈধ রেফারেন্স থাকতে হবে। উল্লেখিত স্ট্রিংটি অবশ্যই একটি বৈধ টাইপ বর্ণনাকারী হতে হবে।
G17 প্রতিটি 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 ছদ্ম-নির্দেশগুলি নিয়ন্ত্রণ প্রবাহের মাধ্যমে পৌঁছানো উচিত নয়।
,

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

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

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

শনাক্তকারী বর্ণনা
জি 1 .dex ফাইলের magic নম্বর 35 সংস্করণের জন্য dex\n035\0 বা পরবর্তী সংস্করণগুলির জন্য অনুরূপ হতে হবে।
G2 চেকসামটি অবশ্যই magic এবং checksum ক্ষেত্র ছাড়া পুরো ফাইলের বিষয়বস্তুর একটি অ্যাডলার-32 চেকসাম হতে হবে।
G3 স্বাক্ষরটি অবশ্যই magic , checksum এবং signature ব্যতীত পুরো ফাইলের বিষয়বস্তুর একটি SHA-1 হ্যাশ হতে হবে।
G4

file_size অবশ্যই বাইটে প্রকৃত ফাইলের আকারের সাথে মিলবে। (v40 বা তার আগের)

file_size অবশ্যই কন্টেইনারের পরবর্তী শিরোনামের দিকে নির্দেশ করতে হবে, অথবা সাইজিক্যাল ফাইলের (কন্টেইনার) শেষে। যদি এটি পরবর্তী হেডারে নির্দেশ করে, ফাইলের আকার অবশ্যই 4-বাইট সারিবদ্ধ হতে হবে। সমস্ত file_size ক্ষেত্রের যোগফল অবশ্যই container_size সমান হতে হবে। (v41 বা তার পরে)

G5

header_size মান থাকতে হবে: 0x70 (v40 বা তার আগের)

header_size মান থাকতে হবে: 0x78 (v41 বা পরবর্তী)

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 ক্ষেত্র অবশ্যই শূন্য বা উভয়ই নন-শূন্য হতে হবে। পরবর্তী ক্ষেত্রে, অফসেটটি চার-বাইট-সারিবদ্ধ হতে হবে।

offset এবং size ক্ষেত্রগুলি অবশ্যই কন্টেইনারের মধ্যে থাকতে হবে এবং সেগুলিকে সংজ্ঞায়িত করে এমন হেডারের পরে অবস্থিত ডেটা উল্লেখ করতে হবে। (v41 বা তার পরে)

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 বিভাগে একটি বৈধ রেফারেন্স থাকতে হবে। (v40 বা তার আগের)

প্রতিটি string_id_item জন্য, string_data_off ক্ষেত্রটি অবশ্যই কন্টেইনারের মধ্যে একটি অফসেট হতে হবে এবং যে কোনও শিরোনাম যা ট্রাসিটিভভাবে এটি ব্যবহার করে। (v41 বা তার পরে)

রেফারেন্সকৃত string_data_item এর জন্য, data ফিল্ডে অবশ্যই একটি বৈধ MUTF-8 স্ট্রিং থাকতে হবে এবং utf16_size অবশ্যই স্ট্রিংটির ডিকোড করা দৈর্ঘ্যের সাথে মেলে।

G16 প্রতিটি type_id_item এর জন্য, descriptor_idx ক্ষেত্রটিতে string_ids তালিকায় একটি বৈধ রেফারেন্স থাকতে হবে। উল্লেখিত স্ট্রিংটি অবশ্যই একটি বৈধ টাইপ বর্ণনাকারী হতে হবে।
G17 প্রতিটি 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 ছদ্ম-নির্দেশগুলি নিয়ন্ত্রণ প্রবাহের মাধ্যমে পৌঁছানো উচিত নয়।
,

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

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

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

শনাক্তকারী বর্ণনা
জি 1 .dex ফাইলের magic নম্বর 35 সংস্করণের জন্য dex\n035\0 বা পরবর্তী সংস্করণগুলির জন্য অনুরূপ হতে হবে।
G2 চেকসামটি অবশ্যই magic এবং checksum ক্ষেত্র ছাড়া পুরো ফাইলের বিষয়বস্তুর একটি অ্যাডলার-32 চেকসাম হতে হবে।
G3 স্বাক্ষরটি অবশ্যই magic , checksum এবং signature ব্যতীত পুরো ফাইলের বিষয়বস্তুর একটি SHA-1 হ্যাশ হতে হবে।
G4

file_size অবশ্যই বাইটে প্রকৃত ফাইলের আকারের সাথে মিলবে। (v40 বা তার আগের)

file_size অবশ্যই কন্টেইনারের পরবর্তী শিরোনামের দিকে নির্দেশ করতে হবে, অথবা সাইজিক্যাল ফাইলের (কন্টেইনার) শেষে। যদি এটি পরবর্তী হেডারে নির্দেশ করে, ফাইলের আকার অবশ্যই 4-বাইট সারিবদ্ধ হতে হবে। সমস্ত file_size ক্ষেত্রের যোগফল অবশ্যই container_size সমান হতে হবে। (v41 বা তার পরে)

G5

header_size মান থাকতে হবে: 0x70 (v40 বা তার আগের)

header_size মান থাকতে হবে: 0x78 (v41 বা পরবর্তী)

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 ক্ষেত্র অবশ্যই শূন্য বা উভয়ই নন-শূন্য হতে হবে। পরবর্তী ক্ষেত্রে, অফসেটটি চার-বাইট-সারিবদ্ধ হতে হবে।

offset এবং size ক্ষেত্রগুলি অবশ্যই কন্টেইনারের মধ্যে থাকতে হবে এবং সেগুলিকে সংজ্ঞায়িত করে এমন হেডারের পরে অবস্থিত ডেটা উল্লেখ করতে হবে। (v41 বা তার পরে)

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 বিভাগে একটি বৈধ রেফারেন্স থাকতে হবে। (v40 বা তার আগের)

প্রতিটি string_id_item জন্য, string_data_off ক্ষেত্রটি অবশ্যই কন্টেইনারের মধ্যে একটি অফসেট হতে হবে এবং যে কোনও শিরোনাম যা ট্রাসিটিভভাবে এটি ব্যবহার করে। (v41 বা তার পরে)

রেফারেন্সকৃত string_data_item এর জন্য, data ফিল্ডে অবশ্যই একটি বৈধ MUTF-8 স্ট্রিং থাকতে হবে এবং utf16_size অবশ্যই স্ট্রিংটির ডিকোড করা দৈর্ঘ্যের সাথে মেলে।

G16 প্রতিটি type_id_item এর জন্য, descriptor_idx ক্ষেত্রটিতে string_ids তালিকায় একটি বৈধ রেফারেন্স থাকতে হবে। উল্লেখিত স্ট্রিংটি অবশ্যই একটি বৈধ টাইপ বর্ণনাকারী হতে হবে।
G17 প্রতিটি 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> নির্দেশ অবশ্যই অবিলম্বে ( insns অ্যারেতে) একটি invoke-<kind> নির্দেশের মাধ্যমে অবশ্যই আগে থাকতে হবে। একমাত্র ব্যতিক্রম হ'ল 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 সিউডো-ইনস্ট্রাকশনগুলি নিয়ন্ত্রণ প্রবাহের মাধ্যমে পৌঁছানোর যোগ্য হওয়া উচিত নয়।
,

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

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

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

শনাক্তকারী বর্ণনা
জি 1 .dex ফাইলের magic নম্বরটি অবশ্যই 35 সংস্করণটির জন্য dex\n035\0 হতে হবে, বা পরবর্তী সংস্করণগুলির জন্য অনুরূপ।
G2 চেকসামটি অবশ্যই magic এবং checksum ক্ষেত্র ব্যতীত পুরো ফাইল সামগ্রীর একটি অ্যাডলার -32 চেকসাম হতে হবে।
G3 স্বাক্ষরটি অবশ্যই magic , checksum এবং signature ব্যতীত পুরো ফাইলের সামগ্রীর একটি SHA-1 হ্যাশ হতে হবে।
G4

file_size অবশ্যই বাইটে আসল ফাইলের আকারের সাথে মেলে। (ভি 40 বা তার আগে)

file_size অবশ্যই ধারকটির পরবর্তী শিরোনামের দিকে বা পাইসিকাল ফাইলের শেষে (ধারক) নির্দেশ করতে হবে। যদি এটি পরবর্তী শিরোনামের দিকে নির্দেশ করে তবে ফাইলের আকার অবশ্যই 4-বাইট সারিবদ্ধ হতে হবে। সমস্ত file_size ক্ষেত্রগুলির যোগফল অবশ্যই container_size সমান। (ভি 41 বা তার পরে)

G5

header_size অবশ্যই মান থাকতে হবে: 0x70 (ভি 40 বা তার আগে)

header_size অবশ্যই মান থাকতে হবে: 0x78 (ভি 41 বা তার পরে)

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 ক্ষেত্রগুলি অবশ্যই শূন্য বা উভয়ই শূন্য হতে হবে। পরবর্তী ক্ষেত্রে, অফসেটটি অবশ্যই চার-বাইট-সারিবদ্ধ হতে হবে।

offset এবং size ক্ষেত্রগুলি অবশ্যই ধারকটির মধ্যে থাকতে হবে এবং তাদের সংজ্ঞায়িত শিরোনামের পরে অবস্থিত ডেটা উল্লেখ করুন। (ভি 41 বা তার পরে)

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 বিভাগে একটি বৈধ রেফারেন্স থাকতে হবে। (ভি 40 বা তার আগে)

প্রতিটি string_id_item জন্য, string_data_off ক্ষেত্রটি অবশ্যই ধারকটির মধ্যে একটি অফসেট হতে হবে এবং যে কোনও শিরোনামের পরে এটি ট্র্যাসিটিভভাবে এটি ব্যবহার করে। (ভি 41 বা তার পরে)

রেফারেন্সড string_data_item জন্য, data ফিল্ডে অবশ্যই একটি বৈধ MUTF-8 স্ট্রিং থাকতে হবে এবং utf16_size অবশ্যই স্ট্রিংয়ের ডিকোডযুক্ত দৈর্ঘ্যের সাথে মেলে।

G16 প্রতিটি type_id_item জন্য, descriptor_idx ক্ষেত্রটিতে অবশ্যই string_ids তালিকায় একটি বৈধ রেফারেন্স থাকতে হবে। রেফারেন্সযুক্ত স্ট্রিংটি অবশ্যই একটি বৈধ ধরণের বর্ণনাকারী হতে হবে।
G17 প্রতিটি 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 অ্যারেতে শেষ নির্দেশটি অবশ্যই সূচক insns_size-1 এ শেষ করতে হবে।
A6 সমস্ত goto এবং if-<kind> লক্ষ্যগুলি একই পদ্ধতির মধ্যে অবশ্যই অপকোড হতে হবে।
A7 একটি packed-switch নির্দেশের সমস্ত লক্ষ্য অবশ্যই একই পদ্ধতির মধ্যে অপকোড হতে হবে। আকার এবং লক্ষ্যগুলির তালিকা অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে।
A8 একটি sparse-switch নির্দেশের সমস্ত লক্ষ্য অবশ্যই একই পদ্ধতির মধ্যে অপকোড হতে হবে। সংশ্লিষ্ট টেবিলটি অবশ্যই সামঞ্জস্যপূর্ণ এবং নিম্ন-উচ্চ-উচ্চ বাছাই করা উচিত।
A9 const-string এবং const-string/jumbo নির্দেশাবলীর B অপারেন্ড অবশ্যই স্ট্রিং ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে।
A10 iget<kind> সি এর C অপারেন্ড এবং iput<kind> নির্দেশাবলী অবশ্যই ক্ষেত্রের ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে। রেফারেন্সড এন্ট্রি অবশ্যই একটি উদাহরণ ক্ষেত্রের প্রতিনিধিত্ব করতে হবে।
A11 sget<kind> এর C অপারেন্ড এবং sput<kind> নির্দেশাবলী অবশ্যই ক্ষেত্রের ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে। রেফারেন্সড এন্ট্রি অবশ্যই একটি স্থির ক্ষেত্রের প্রতিনিধিত্ব করতে হবে।
A12 invoke-virtual , invoke-super , invoke-direct এবং invoke-static নির্দেশাবলীর C অপারেন্ডটি অবশ্যই পদ্ধতি ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে।
A13 invoke-virtual/range B অপারেন্ড, invoke-super/range , invoke-direct/range এবং invoke-static/range নির্দেশাবলী অবশ্যই পদ্ধতি ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে।
A14 একটি পদ্ধতির নাম যার নাম '<' দিয়ে শুরু হয় কেবল ভিএম দ্বারা স্পষ্টভাবে আহ্বান করা উচিত, কোনও .dex ফাইল থেকে উত্পন্ন কোড দ্বারা নয়। একমাত্র ব্যতিক্রম হ'ল উদাহরণ ইনিশিয়ালাইজার, যা invoke-direct দ্বারা আহ্বান করা যেতে পারে।
A15 invoke-interface নির্দেশের C অপারেন্ডটি অবশ্যই পদ্ধতি ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে। রেফারেন্সড method_id অবশ্যই একটি ইন্টারফেসের সাথে সম্পর্কিত (কোনও শ্রেণি নয়)।
A16 invoke-interface/range নির্দেশের B অপারেন্ডটি অবশ্যই পদ্ধতি ধ্রুবক পুলের একটি বৈধ সূচক হতে হবে। রেফারেন্সড method_id অবশ্যই একটি ইন্টারফেসের সাথে সম্পর্কিত (কোনও শ্রেণি নয়)।
A17 const-class B অপারেন্ড, check-cast , new-instance এবং filled-new-array/range নির্দেশাবলী অবশ্যই ধ্রুবক পুলের মধ্যে একটি বৈধ সূচক হতে হবে।
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> নির্দেশ অবশ্যই অবিলম্বে ( insns অ্যারেতে) একটি invoke-<kind> নির্দেশের মাধ্যমে অবশ্যই আগে থাকতে হবে। একমাত্র ব্যতিক্রম হ'ল 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 সিউডো-ইনস্ট্রাকশনগুলি নিয়ন্ত্রণ প্রবাহের মাধ্যমে পৌঁছানোর যোগ্য হওয়া উচিত নয়।