Kendala

File .dex adalah format transport untuk Dalvik Bytecode. Ada batasan sintaksis dan semantik tertentu agar file menjadi file .dex yang valid, dan waktu proses diperlukan untuk hanya mendukung file .dex yang valid.

Batasan integritas .dex umum

Batasan integritas umum berkaitan dengan struktur file .dex yang lebih besar, seperti yang dijelaskan secara rinci dalam format .dex .

pengenal Keterangan
G1 Angka magic dari file .dex harus dex\n035\0 atau dex\n037\0 .
G2 Checksum harus berupa checksum Adler-32 dari seluruh konten file kecuali bidang magic dan checksum .
G3 Tanda tangan harus berupa hash SHA-1 dari seluruh isi file kecuali magic , checksum , dan signature .
G4 file_size harus sesuai dengan ukuran file sebenarnya dalam byte.
G5 header_size harus memiliki nilai: 0x70
G6 endian_tag harus memiliki nilai: ENDIAN_CONSTANT atau REVERSE_ENDIAN_CONSTANT
G7 Untuk setiap bagian link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs , dan data , bidang offset dan size harus nol atau keduanya bukan nol. Dalam kasus terakhir, offset harus disejajarkan dengan empat byte.
G8 Semua bidang offset di header kecuali map_off harus disejajarkan dengan empat byte.
G9 Bidang map_off harus nol atau menunjuk ke bagian data. Dalam kasus terakhir, bagian data harus ada.
G10 Tak satu pun dari bagian link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs dan data harus saling tumpang tindih atau header.
G11 Jika ada peta, maka setiap entri peta harus memiliki tipe yang valid. Setiap jenis dapat muncul paling banyak satu kali.
G12 Jika ada peta, maka setiap entri peta harus memiliki offset dan ukuran bukan nol. Offset harus mengarah ke bagian file yang sesuai (yaitu string_id_item harus mengarah ke bagian string_ids ) dan ukuran item yang eksplisit atau implisit harus sesuai dengan konten dan ukuran bagian yang sebenarnya.
G13 Jika ada peta, maka offset entri peta n+1 harus lebih besar atau sama dengan offset entri peta n plus than size of map entry n . Ini menyiratkan entri yang tidak tumpang tindih dan pemesanan rendah ke tinggi.
G14 Jenis entri berikut harus memiliki offset yang disejajarkan empat byte: 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 .
G15 Untuk setiap string_id_item , bidang string_data_off harus berisi referensi yang valid ke dalam bagian data . Untuk string_data_item yang direferensikan, bidang data harus berisi string MUTF-8 yang valid, dan utf16_size harus cocok dengan panjang string yang didekodekan.
G16 Untuk setiap type_id_item , bidang descriptor_idx harus berisi referensi yang valid ke dalam daftar string_ids . String yang direferensikan harus berupa deskriptor tipe yang valid.
G17 Untuk setiap proto_id_item , bidang shorty_idx harus berisi referensi yang valid ke dalam daftar string_ids . String yang direferensikan harus berupa deskriptor pendek yang valid. Juga, bidang return_type_idx harus berupa indeks yang valid ke dalam bagian type_ids , dan bidang parameters_off harus nol atau offset yang valid yang menunjuk ke bagian data . Jika bukan nol, daftar parameter tidak boleh berisi entri kosong.
G18 Untuk setiap field_id_item , baik class_idx dan type_idx harus berupa indeks yang valid ke dalam daftar type_ids . Entri yang direferensikan oleh class_idx harus berupa tipe referensi non-array. Selain itu, bidang name_idx harus menjadi referensi yang valid ke dalam bagian string_ids , dan konten entri yang direferensikan harus sesuai dengan spesifikasi MemberName .
G19 Untuk setiap method_id_item , bidang class_idx harus berupa indeks yang valid ke dalam bagian type_ids , dan entri yang direferensikan harus berupa tipe referensi non-array. Bidang proto_id harus menjadi referensi yang valid ke dalam daftar proto_ids . Bidang name_idx harus menjadi referensi yang valid ke bagian string_ids , dan konten entri yang direferensikan harus sesuai dengan spesifikasi MemberName .
G20 Untuk setiap field_id_item , field class_idx harus berupa indeks yang valid ke dalam daftar type_ids . Entri yang direferensikan harus berupa tipe referensi non-array.

Batasan bytecode statis

Kendala statis adalah kendala pada elemen individu dari bytecode. Mereka biasanya dapat diperiksa tanpa menggunakan kontrol atau teknik analisis aliran data.

pengenal Keterangan
A1 Array insns wajib diisi.
A2 Opcode pertama dalam array insns harus memiliki indeks nol.
A3 Array insns hanya boleh berisi opcode Dalvik yang valid.
A4 Indeks instruksi n+1 harus sama dengan indeks instruksi n ditambah panjang instruksi n , dengan mempertimbangkan kemungkinan operan.
A5 Instruksi terakhir dalam array insns harus diakhiri dengan indeks insns_size-1 .
A6 Semua target goto dan if-<kind> harus opcode dalam metode yang sama.
A7 Semua target instruksi packet packed-switch harus opcode dalam metode yang sama. Ukuran dan daftar target harus konsisten.
A8 Semua target instruksi sparse-switch harus opcode dalam metode yang sama. Tabel yang sesuai harus konsisten dan diurutkan dari rendah ke tinggi.
A9 Operand B dari instruksi const-string dan const-string/jumbo harus berupa indeks yang valid ke dalam kumpulan konstanta string.
A10 Operand C dari iget<kind> dan iput<kind> harus berupa indeks yang valid ke dalam kumpulan konstanta bidang. Entri yang direferensikan harus mewakili bidang instance.
A11 Operand C dari sget<kind> dan sput<kind> harus berupa indeks yang valid ke dalam kumpulan konstanta bidang. Entri yang direferensikan harus mewakili bidang statis.
A12 Operand C dari instruksi invoke-virtual , invoke-super , invoke-direct dan invoke-static harus berupa indeks yang valid ke dalam kumpulan konstanta metode.
A13 Operan B dari instruksi invoke-virtual/range , invoke-super/range , invoke-direct/range , dan invoke-static/range harus merupakan indeks yang valid ke dalam kumpulan konstanta metode.
A14 Metode yang namanya dimulai dengan '<' hanya boleh dipanggil secara implisit oleh VM, bukan dengan kode yang berasal dari file .dex . Satu-satunya pengecualian adalah penginisialisasi instance, yang dapat dipanggil oleh invoke-direct .
A15 Operand C dari instruksi invoke-interface harus berupa indeks yang valid ke dalam kumpulan konstanta metode. method_id direferensikan harus milik antarmuka (bukan kelas).
A16 Operand B dari instruksi invoke-interface/range harus berupa indeks yang valid ke dalam kumpulan konstanta metode. method_id direferensikan harus milik antarmuka (bukan kelas).
A17 Operand B dari instruksi const-class , check-cast , new-instance , dan filled-new-array/range harus berupa indeks yang valid ke dalam kumpulan konstanta tipe.
A18 Operand C dari instruksi instance-of , new-array , dan filled-new-array harus berupa indeks yang valid ke dalam kumpulan konstanta tipe.
A19 Dimensi array yang dibuat oleh instruksi new-array harus kurang dari 256 .
A20 Instruksi new tidak boleh merujuk ke kelas array, antarmuka, atau kelas abstrak.
A21 Tipe yang dirujuk oleh instruksi new-array harus valid, tipe non-referensi.
A22 Semua register yang dirujuk oleh instruksi dalam mode single-width (non-pair) harus valid untuk metode saat ini. Artinya, indeksnya harus non-negatif dan lebih kecil dari registers_size .
A23 Semua register yang dirujuk oleh instruksi dalam mode lebar ganda (pasangan) harus valid untuk metode saat ini. Artinya, indeksnya harus non-negatif dan lebih kecil dari registers_size-1 .
A24 Operand method_id dari instruksi invoke-virtual dan invoke-direct harus dimiliki oleh sebuah kelas (bukan sebuah antarmuka). Dalam file Dex sebelum versi 037 , hal yang sama harus berlaku untuk instruksi invoke-super dan invoke-static .
A25 Operand method_id dari instruksi invoke-virtual/range dan invoke-direct/range harus dimiliki oleh suatu kelas (bukan antarmuka). Dalam file Dex sebelum versi 037 , hal yang sama harus berlaku untuk instruksi invoke-super/range dan invoke-static/range .

Batasan bytecode struktural

Kendala struktural adalah kendala pada hubungan antara beberapa elemen bytecode. Mereka biasanya tidak dapat diperiksa tanpa menggunakan kontrol atau teknik analisis aliran data.

pengenal Keterangan
B1 Jumlah dan jenis argumen (register dan nilai langsung) harus selalu sesuai dengan instruksi.
B2 Daftar pasangan tidak boleh putus.
B3 Register (atau pasangan) harus ditetapkan terlebih dahulu sebelum dapat dibaca.
B4 Instruksi invoke-direct harus memanggil penginisialisasi instans atau metode hanya di kelas saat ini atau salah satu superkelasnya.
B5 Penginisialisasi instance harus dipanggil hanya pada instance yang tidak diinisialisasi.
B6 Metode instans dapat dipanggil hanya pada dan bidang instans hanya dapat diakses pada instans yang sudah diinisialisasi.
B7 Register yang menyimpan hasil dari instruksi new-instance tidak boleh digunakan jika instruksi new-instance yang sama dieksekusi lagi sebelum instance diinisialisasi.
B8 Penginisialisasi instance harus memanggil penginisialisasi instance lain (kelas atau superclass yang sama) sebelum anggota instance dapat diakses. Pengecualian adalah bidang instance yang tidak diwariskan, yang dapat ditetapkan sebelum memanggil penginisialisasi lain, dan kelas Object secara umum.
B9 Semua argumen metode aktual harus kompatibel dengan penugasan dengan argumen formal masing-masing.
B10 Untuk setiap pemanggilan metode instance, instance aktual harus kompatibel dengan tugas dengan kelas atau antarmuka yang ditentukan dalam instruksi.
B11 Instruksi return<kind> harus cocok dengan tipe pengembalian metodenya.
B12 Saat mengakses anggota superclass yang dilindungi, tipe aktual dari instance yang diakses harus berupa kelas saat ini atau salah satu subkelasnya.
B13 Jenis nilai yang disimpan ke dalam bidang statis harus kompatibel dengan penetapan atau dapat dikonversi ke jenis bidang.
B14 Jenis nilai yang disimpan ke dalam bidang harus kompatibel dengan penetapan atau dapat dikonversi ke jenis bidang.
B15 Jenis setiap nilai yang disimpan ke dalam larik harus kompatibel dengan tugas dengan jenis komponen larik.
B16 Operand A dari instruksi throw harus kompatibel dengan tugas dengan java.lang.Throwable .
B17 Instruksi terakhir yang dapat dijangkau dari suatu metode harus berupa goto atau cabang mundur, return , atau instruksi throw . Tidak mungkin untuk meninggalkan array insns di bagian bawah.
B18 Separuh yang belum ditetapkan dari pasangan register sebelumnya tidak dapat dibaca (dianggap tidak valid) sampai telah ditetapkan kembali oleh beberapa instruksi lain.
B19 Instruksi move-result<kind> harus segera didahului (dalam array insns ) oleh invoke-<kind> . Satu-satunya pengecualian adalah instruksi move-result-object , yang juga dapat didahului oleh instruksi filled-new-array .
B20 Instruksi move-result<kind> harus segera didahului (dalam aliran kontrol aktual) dengan instruksi return-<kind> yang cocok (tidak boleh dilompati). Satu-satunya pengecualian adalah instruksi move-result-object , yang juga dapat didahului oleh instruksi filled-new-array .
B21 Instruksi move-exception harus muncul hanya sebagai instruksi pertama dalam exception handler.
B22 Pseudo-instruksi packed-switch-data , sparse-switch-data , dan fill-array-data tidak boleh dijangkau oleh aliran kontrol.