Ограничения

Файл .dex — это транспортный формат для байт-кода Dalvik. Существуют определенные синтаксические и семантические ограничения для того, чтобы файл был допустимым файлом .dex , и среда выполнения должна поддерживать только допустимые файлы .dex.

Общие ограничения целостности .dex

Общие ограничения целостности касаются более крупной структуры файла .dex , как подробно описано в формате .dex .

Идентификатор Описание
Г1 magic номер файла .dex должен быть dex\n035\0 для версии 35 или аналогичный для более поздних версий.
G2 Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, за исключением magic поля и поля checksum .
G3 Подпись должна представлять собой хеш SHA-1 всего содержимого файла, за исключением magic , checksum и signature .
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 должен существовать.
G10 Ни одна из link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs и разделов data не должна перекрывать друг друга или заголовок.
G11 Если карта существует, каждая запись карты должна иметь допустимый тип. Каждый тип может появиться не более одного раза.
G12 Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (т. е. string_id_item должно указывать на раздел string_ids ), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела.
G13 Если карта существует, то смещение записи карты n+1 должно быть больше или равно смещению записи карты n plus than size of map entry n . Это подразумевает непересекающиеся записи и упорядочение от низкого к высокому.
G14 Следующие типы записей должны иметь смещение, выровненное по четырем байтам: 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

Для каждого 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 . Если значение не равно нулю, список параметров не должен содержать пустых записей.
G18 Для каждого 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 . Ссылочная запись не должна быть ссылочным типом, отличным от массива.

Статические ограничения байт-кода

Статические ограничения — это ограничения на отдельные элементы байт-кода. Обычно их можно проверить без использования методов контроля или анализа потока данных.

Идентификатор Описание
А1 Массив insns не должен быть пустым.
А2 Первый код операции в массиве insns должен иметь нулевой индекс.
А3 Массив insns должен содержать только допустимые коды операций Dalvik.
А4 Индекс инструкции n+1 должен равняться индексу инструкции n плюс длине инструкции n с учетом возможных операндов.
А5 Последняя инструкция в массиве insns должна заканчиваться индексом insns_size-1 .
А6 Все цели goto и if-<kind> должны быть кодами операций одного и того же метода.
А7 Все цели инструкции packed-switch должны быть кодами операций одного и того же метода. Размер и список целей должны быть последовательными.
А8 Все цели инструкции sparse-switch должны быть кодами операций одного и того же метода. Соответствующая таблица должна быть последовательной и отсортированной по возрастанию.
А9 Операнд B инструкций const-string и const-string/jumbo должен быть допустимым индексом в пуле строковых констант.
А10 Операнд C инструкций iget<kind> и iput<kind> должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять поле экземпляра.
А11 Операнд C инструкций sget<kind> и sput<kind> должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять статическое поле.
А12 Операнд C инструкций invoke-virtual , invoke-super , invoke-direct и invoke-static должен быть допустимым индексом в пуле констант метода.
А13 Операнд B инструкций invoke-virtual/range , invoke-super/range , invoke-direct/range и invoke-static/range должен быть допустимым индексом в пуле констант метода.
А14 Метод, имя которого начинается с '<', должен вызываться только неявно виртуальной машиной, а не кодом, созданным из файла .dex . Единственным исключением является инициализатор экземпляра, который можно вызвать с помощью invoke-direct .
А15 Операнд C инструкции invoke-interface должен быть допустимым индексом в пуле констант метода. Ссылочный method_id должен принадлежать интерфейсу (а не классу).
А16 Операнд B инструкции invoke-interface/range должен быть допустимым индексом в пуле констант метода. Ссылочный method_id должен принадлежать интерфейсу (а не классу).
А17 Операнд B инструкций const-class , check-cast , new-instance и filled-new-array/range должен быть допустимым индексом в пуле констант типа.
А18 Операнд C инструкций instance-of , new-array и filled-new-array должен быть допустимым индексом в пуле констант типа.
А19 Размеры массива, созданного командой создания new-array должны быть меньше 256 .
А20 new инструкция не должна ссылаться на классы массивов, интерфейсы или абстрактные классы.
А21 Тип, на который ссылается инструкция создания new-array должен быть допустимым, не ссылочным типом.
А22 Все регистры, на которые ссылается инструкция одинарной ширины (не парные), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size .
А23 Все регистры, на которые ссылается инструкция в виде двойной ширины (пары), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1 .
А24 Операнд method_id инструкций invoke-virtual и invoke-direct должен принадлежать классу (а не интерфейсу). В файлах Dex до версии 037 то же самое должно быть справедливо для инструкций invoke-super и invoke-static .
А25 Операнд method_id инструкций invoke-virtual/range и invoke-direct/range должен принадлежать классу (а не интерфейсу). В файлах Dex до версии 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 Операнд A инструкции throw должен быть совместим по назначению с 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 не должны быть доступны для потока управления.
,

Файл .dex — это транспортный формат для байт-кода Dalvik. Существуют определенные синтаксические и семантические ограничения для того, чтобы файл был допустимым файлом .dex , и среда выполнения должна поддерживать только допустимые файлы .dex.

Общие ограничения целостности .dex

Общие ограничения целостности касаются более крупной структуры файла .dex , как подробно описано в формате .dex .

Идентификатор Описание
Г1 magic номер файла .dex должен быть dex\n035\0 для версии 35 или аналогичный для более поздних версий.
G2 Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, за исключением magic поля и поля checksum .
G3 Подпись должна представлять собой хеш SHA-1 всего содержимого файла, за исключением magic , checksum и signature .
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 должен существовать.
G10 Ни одна из link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs и разделов data не должна перекрывать друг друга или заголовок.
G11 Если карта существует, каждая запись карты должна иметь допустимый тип. Каждый тип может появиться не более одного раза.
G12 Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (т. е. string_id_item должно указывать на раздел string_ids ), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела.
G13 Если карта существует, то смещение записи карты n+1 должно быть больше или равно смещению записи карты n plus than size of map entry n . Это подразумевает непересекающиеся записи и упорядочение от низкого к высокому.
G14 Следующие типы записей должны иметь смещение, выровненное по четырем байтам: 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

Для каждого 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 . Если значение не равно нулю, список параметров не должен содержать пустых записей.
G18 Для каждого 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 . Ссылочная запись не должна быть ссылочным типом, отличным от массива.

Статические ограничения байт-кода

Статические ограничения — это ограничения на отдельные элементы байт-кода. Обычно их можно проверить без использования методов контроля или анализа потока данных.

Идентификатор Описание
А1 Массив insns не должен быть пустым.
А2 Первый код операции в массиве insns должен иметь нулевой индекс.
А3 Массив insns должен содержать только допустимые коды операций Dalvik.
А4 Индекс инструкции n+1 должен равняться индексу инструкции n плюс длине инструкции n с учетом возможных операндов.
А5 Последняя инструкция в массиве insns должна заканчиваться индексом insns_size-1 .
А6 Все цели goto и if-<kind> должны быть кодами операций одного и того же метода.
А7 Все цели инструкции packed-switch должны быть кодами операций одного и того же метода. Размер и список целей должны быть последовательными.
А8 Все цели инструкции sparse-switch должны быть кодами операций одного и того же метода. Соответствующая таблица должна быть последовательной и отсортированной по возрастанию.
А9 Операнд B инструкций const-string и const-string/jumbo должен быть допустимым индексом в пуле строковых констант.
А10 Операнд C инструкций iget<kind> и iput<kind> должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять поле экземпляра.
А11 Операнд C инструкций sget<kind> и sput<kind> должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять статическое поле.
А12 Операнд C инструкций invoke-virtual , invoke-super , invoke-direct и invoke-static должен быть допустимым индексом в пуле констант метода.
А13 Операнд B инструкций invoke-virtual/range , invoke-super/range , invoke-direct/range и invoke-static/range должен быть допустимым индексом в пуле констант метода.
А14 Метод, имя которого начинается с '<', должен вызываться только неявно виртуальной машиной, а не кодом, созданным из файла .dex . Единственным исключением является инициализатор экземпляра, который можно вызвать с помощью invoke-direct .
А15 Операнд C инструкции invoke-interface должен быть допустимым индексом в пуле констант метода. Ссылочный method_id должен принадлежать интерфейсу (а не классу).
А16 Операнд B инструкции invoke-interface/range должен быть допустимым индексом в пуле констант метода. Ссылочный method_id должен принадлежать интерфейсу (а не классу).
А17 Операнд B инструкций const-class , check-cast , new-instance и filled-new-array/range должен быть допустимым индексом в пуле констант типа.
А18 Операнд C инструкций instance-of , new-array и filled-new-array должен быть допустимым индексом в пуле констант типа.
А19 Размеры массива, созданного командой создания new-array должны быть меньше 256 .
А20 new инструкция не должна ссылаться на классы массивов, интерфейсы или абстрактные классы.
А21 Тип, на который ссылается инструкция создания new-array должен быть допустимым, не ссылочным типом.
А22 Все регистры, на которые ссылается инструкция одинарной ширины (не парные), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size .
А23 Все регистры, на которые ссылается инструкция в виде двойной ширины (пары), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1 .
А24 Операнд method_id инструкций invoke-virtual и invoke-direct должен принадлежать классу (а не интерфейсу). В файлах Dex до версии 037 то же самое должно быть справедливо для инструкций invoke-super и invoke-static .
А25 Операнд method_id инструкций invoke-virtual/range и invoke-direct/range должен принадлежать классу (а не интерфейсу). В файлах Dex до версии 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 Операнд A инструкции throw должен быть совместим по назначению с 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 не должны быть доступны для потока управления.
,

Файл .dex — это транспортный формат для байт-кода Dalvik. Существуют определенные синтаксические и семантические ограничения для того, чтобы файл был допустимым файлом .dex , и среда выполнения должна поддерживать только допустимые файлы .dex.

Общие ограничения целостности .dex

Общие ограничения целостности касаются более крупной структуры файла .dex , как подробно описано в формате .dex .

Идентификатор Описание
Г1 magic номер файла .dex должен быть dex\n035\0 для версии 35 или аналогичный для более поздних версий.
G2 Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, за исключением magic поля и поля checksum .
G3 Подпись должна представлять собой хеш SHA-1 всего содержимого файла, за исключением magic , checksum и signature .
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 должен существовать.
G10 Ни одна из link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs и разделов data не должна перекрывать друг друга или заголовок.
G11 Если карта существует, каждая запись карты должна иметь допустимый тип. Каждый тип может появиться не более одного раза.
G12 Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (т. е. string_id_item должно указывать на раздел string_ids ), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела.
G13 Если карта существует, то смещение записи карты n+1 должно быть больше или равно смещению записи карты n plus than size of map entry n . Это подразумевает непересекающиеся записи и упорядочение от низкого к высокому.
G14 Следующие типы записей должны иметь смещение, выровненное по четырем байтам: 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

Для каждого 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 . Если значение не равно нулю, список параметров не должен содержать пустых записей.
G18 Для каждого 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 . Ссылочная запись не должна быть ссылочным типом, отличным от массива.

Статические ограничения байт-кода

Статические ограничения — это ограничения на отдельные элементы байт-кода. Обычно их можно проверить без использования методов контроля или анализа потока данных.

Идентификатор Описание
А1 Массив insns не должен быть пустым.
А2 Первый код операции в массиве insns должен иметь нулевой индекс.
А3 Массив insns должен содержать только допустимые коды операций Dalvik.
А4 Индекс инструкции n+1 должен равняться индексу инструкции n плюс длине инструкции n с учетом возможных операндов.
А5 Последняя инструкция в массиве insns должна заканчиваться индексом insns_size-1 .
А6 Все цели goto и if-<kind> должны быть кодами операций одного и того же метода.
А7 Все цели инструкции packed-switch должны быть кодами операций одного и того же метода. Размер и список целей должны быть последовательными.
А8 Все цели инструкции sparse-switch должны быть кодами операций одного и того же метода. Соответствующая таблица должна быть последовательной и отсортированной по возрастанию.
А9 Операнд B инструкций const-string и const-string/jumbo должен быть допустимым индексом в пуле строковых констант.
А10 Операнд C инструкций iget<kind> и iput<kind> должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять поле экземпляра.
А11 Операнд C инструкций sget<kind> и sput<kind> должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять статическое поле.
А12 Операнд C инструкций invoke-virtual , invoke-super , invoke-direct и invoke-static должен быть допустимым индексом в пуле констант метода.
А13 Операнд B инструкций invoke-virtual/range , invoke-super/range , invoke-direct/range и invoke-static/range должен быть допустимым индексом в пуле констант метода.
А14 Метод, имя которого начинается с '<', должен вызываться только неявно виртуальной машиной, а не кодом, созданным из файла .dex . Единственным исключением является инициализатор экземпляра, который можно вызвать с помощью invoke-direct .
А15 Операнд C инструкции invoke-interface должен быть допустимым индексом в пуле констант метода. Ссылочный method_id должен принадлежать интерфейсу (а не классу).
А16 Операнд B инструкции invoke-interface/range должен быть допустимым индексом в пуле констант метода. Ссылочный method_id должен принадлежать интерфейсу (а не классу).
А17 Операнд B инструкций const-class , check-cast , new-instance и filled-new-array/range должен быть допустимым индексом в пуле констант типа.
А18 Операнд C инструкций instance-of , new-array и filled-new-array должен быть допустимым индексом в пуле констант типа.
А19 Размеры массива, созданного командой создания new-array должны быть меньше 256 .
А20 new инструкция не должна ссылаться на классы массивов, интерфейсы или абстрактные классы.
А21 Тип, на который ссылается инструкция создания new-array должен быть допустимым, не ссылочным типом.
А22 Все регистры, на которые ссылается инструкция одинарной ширины (не парные), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size .
А23 Все регистры, на которые ссылается инструкция в виде двойной ширины (пары), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1 .
А24 method_id Операнд инструкций invoke-virtual и invoke-direct должен принадлежать классу (не интерфейс). В файлах DEX до версии 037 то же самое должно быть верно для инструкций invoke-super и invoke-static .
A25 Операнд method_id из инструкций invoke-virtual/range и invoke-direct/range должен принадлежать классу (не интерфейс). В файлах DEX до версии 037 то же самое должно быть правдой для invoke-super/range и invoke-static/range Trancs.

Структурные ограничения байт -кодов

Структурные ограничения являются ограничениями на отношения между несколькими элементами байт -кода. Они обычно не могут быть проверены без использования контроля или методов анализа данных.

Идентификатор Описание
Б1 Число и типы аргументов (регистры и непосредственные значения) всегда должны соответствовать инструкции.
Б2 Пары регистрации никогда не должны быть разбиты.
B3 Регистр (или пара) должен быть назначен сначала, прежде чем его можно будет прочитать.
B4 Инструкция invoke-direct должна вызвать инициализатор экземпляра или метод только в текущем классе или одном из его суперкладов.
Б5 Инициализатор экземпляра должен быть вызван только в ненициализованном экземпляре.
Б6 Методы экземпляра могут быть вызваны только на полях экземпляра, и можно получить доступ только на уже инициализированных экземплярах.
Б7 Регистр, который содержит результат инструкции new-instance не должен использоваться, если та же new-instance инструкция снова выполняется до того, как экземпляр будет инициализирован.
Б8 Инициализатор экземпляра должен вызвать другой экземпляр инициализатора (тот же класс или Superclass), прежде чем можно получить доступ к любому экземпляру. Исключениями являются неудовлетворенные поля экземпляра, которые могут быть назначены перед вызовом другого инициализатора и класса Object в целом.
Б9 Все фактические аргументы метода должны соответствовать назначению с их соответствующими формальными аргументами.
Б10 Для каждого вызова метода экземпляра фактический экземпляр должен быть совместимы с назначением с классом или интерфейсом, указанным в инструкции.
Б11 Инструкция return<kind> должна соответствовать типу возврата его метода.
Б12 При доступе к защищенным членам суперкласса фактический тип доступного экземпляра должен быть либо текущим классом, либо одним из его подклассов.
Б13 Тип значения, хранящегося в статическом поле, должен соответствовать назначению или конвертируемым или конвертируемым с типом поля.
Б14 Тип значения, хранящегося в поле, должен соответствовать назначению или конвертируемым с типом поля.
Б15 Тип каждого значения, хранящегося в массиве, должен соответствовать назначению с типом компонента массива.
B16 A инструкции throw должен быть совместимы с заданием с java.lang.Throwable .
Б17 Последняя добраемая инструкция метода должна быть либо обратной goto , либо ветвью, return или инструкцией throw . Не должно быть возможно оставить массив insns внизу.
B18 Незначенная половина бывшей пары регистрации не может быть прочитана (считается недействительной) до тех пор, пока она не будет переизведена какой-либо другой инструкцией.
Б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 .
B21 Инструкция move-exception должна появляться только в качестве первой инструкции в обработчике исключений.
B22 packed-switch-data , sparse-switch-data и псевдо-инструктивы fill-array-data не должны быть достигнуты при потоке управления.
,

Файл .dex является транспортным форматом для Dalvik Bytecode. Существуют определенные синтаксические и семантические ограничения для файла, который является допустимым файлом .dex , и время выполнения требуется для поддержки только допустимых файлов .dex.

Общие ограничения целостности.

Общие ограничения целостности связаны с более крупной структурой файла .dex , как подробно описано в .dex format .

Идентификатор Описание
Г1 magic количество файла .dex должно быть dex\n035\0 для версии 35 или аналогично для более поздних версий.
G2 Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, кроме поля magic и checksum .
G3 Подпись должна быть хэш SHA-1 всего содержимого файла, кроме magic , checksum и signature .
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 .
G10 Ни одна из link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs и разделов data должны перекрывать друг друга или заголовок.
G11 Если карта существует, то каждая запись карты должна иметь допустимый тип. Каждый тип может появляться не более одного раза.
G12 Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (то есть string_id_item должен указывать в раздел string_ids ), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела.
G13 Если карта существует, то смещение записи карты n+1 должно быть больше или равно смещению записи карты n plus than size of map entry n . Это подразумевает непересекающиеся записи и приказ от низких до высоких.
G14 Следующие типы записей должны иметь смещение с четырьмя байтами: 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

Для каждой 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 . Если ненулевой, список параметров не должен содержать никаких пустовых записей.
G18 Для каждого 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 . Наслаждаемая запись должна быть ссылочным типом, не являющимися арестом.

Статические ограничения байт -кодов

Статические ограничения являются ограничениями на отдельные элементы байт -кода. Они обычно могут быть проверены без использования контроля или методов анализа данных.

Идентификатор Описание
А1 Массив insns не должен быть пустым.
А2 Первый Opcode в массиве insns должен иметь индекс.
А3 Массив insns должен содержать только действительные Dalvik Opcodes.
А4 Индекс инструкции n+1 должен равняться индексу инструкции n плюс продолжительность инструкции n с учетом возможных операндов.
А5 Последняя инструкция в массиве insns должна заканчиваться на индексе insns_size-1 .
А6 Все goto и if-<kind> должны быть выборы в одном и том же методе.
А7 Все цели инструкции packed-switch должны быть опкомпомированием в пределах одного и того же метода. Размер и список целей должны быть последовательными.
А8 Все целевые показатели sparse-switch инструкции должны быть выбором в одном и том же методе. Соответствующая таблица должна быть последовательной и отсортированной от низкой до высокой.
А9 Операн B const-string и const-string/jumbo инструкций должен быть допустимым индексом в пул строковой константы.
А10 Операнд C из инструкций iget<kind> и iput<kind> должен быть действительным индексом в постоянном пуле поле. Наслаждаемая запись должна представлять поле экземпляра.
A11 Операнд C of sget<kind> и sput<kind> Инструкции должны быть действительным индексом в постоянный пул поля. Наслаждаемая запись должна представлять статическое поле.
А12 Операнд C of the invoke-virtual , invoke-super , invoke-direct и invoke-static должен быть действительным индексом в пуле постоянного метода.
А13 Опель B of the invoke-virtual/range , invoke-super/range , invoke-direct/range и инструкции invoke-static/range должны быть действительным индексом в пуле постоянного метода.
A14 Метод, название которого начинается с «<», должен только вызывать виртуальную машину, а не код, происходящий из файла .dex . Единственным исключением является инициализатор экземпляра, который может быть вызван invoke-direct .
A15 Операн C Инструкции invoke-interface должен быть допустимым индексом в пуле постоянного метода. Способный method_id должен принадлежать к интерфейсу (не классу).
A16 Опец B операн из инструкции invoke-interface/range должен быть допустимым индексом в пуле постоянного метода. Способный method_id должен принадлежать к интерфейсу (не классу).
A17 B -операнд B const-class , check-cast , new-instance и filled-new-array/range должен быть допустимым индексом в пуле постоянного типа.
A18 Операнд C instance-of , new-array и инструкций filled-new-array должен быть действительным индексом в постоянный пул типа.
A19 Размеры массива, созданного new-array инструкцией, должны составлять менее 256 .
А20 new инструкция не должна относиться к классам массива, интерфейсам или абстрактным классам.
A21 Тип, упомянутый инструкцией с new-array должен быть действительным типом без ссылки.
A22 Все регистры, упомянутые инструкцией в моде с одной шириной (не пары), должны быть действительными для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size .
A23 Все регистры, упомянутые инструкцией в моде с двойной шириной (пара), должны быть действительными для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1 .
A24 method_id Операнд инструкций invoke-virtual и invoke-direct должен принадлежать классу (не интерфейс). В файлах DEX до версии 037 то же самое должно быть верно для инструкций invoke-super и invoke-static .
A25 Операнд method_id из инструкций invoke-virtual/range и invoke-direct/range должен принадлежать классу (не интерфейс). В файлах DEX до версии 037 то же самое должно быть правдой для invoke-super/range и invoke-static/range Trancs.

Структурные ограничения байт -кодов

Структурные ограничения являются ограничениями на отношения между несколькими элементами байт -кода. Они обычно не могут быть проверены без использования контроля или методов анализа данных.

Идентификатор Описание
Б1 Число и типы аргументов (регистры и непосредственные значения) всегда должны соответствовать инструкции.
Б2 Пары регистрации никогда не должны быть разбиты.
B3 Регистр (или пара) должен быть назначен сначала, прежде чем его можно будет прочитать.
B4 Инструкция invoke-direct должна вызвать инициализатор экземпляра или метод только в текущем классе или одном из его суперкладов.
Б5 Инициализатор экземпляра должен быть вызван только в ненициализованном экземпляре.
Б6 Методы экземпляра могут быть вызваны только на полях экземпляра, и можно получить доступ только на уже инициализированных экземплярах.
Б7 Регистр, который содержит результат инструкции new-instance не должен использоваться, если та же new-instance инструкция снова выполняется до того, как экземпляр будет инициализирован.
Б8 Инициализатор экземпляра должен вызвать другой экземпляр инициализатора (тот же класс или Superclass), прежде чем можно получить доступ к любому экземпляру. Исключениями являются неудовлетворенные поля экземпляра, которые могут быть назначены перед вызовом другого инициализатора и класса Object в целом.
Б9 Все фактические аргументы метода должны соответствовать назначению с их соответствующими формальными аргументами.
Б10 Для каждого вызова метода экземпляра фактический экземпляр должен быть совместимы с назначением с классом или интерфейсом, указанным в инструкции.
Б11 Инструкция return<kind> должна соответствовать типу возврата его метода.
Б12 При доступе к защищенным членам суперкласса фактический тип доступного экземпляра должен быть либо текущим классом, либо одним из его подклассов.
Б13 Тип значения, хранящегося в статическом поле, должен соответствовать назначению или конвертируемым или конвертируемым с типом поля.
Б14 Тип значения, хранящегося в поле, должен соответствовать назначению или конвертируемым с типом поля.
Б15 Тип каждого значения, хранящегося в массиве, должен соответствовать назначению с типом компонента массива.
B16 A инструкции throw должен быть совместимы с заданием с java.lang.Throwable .
Б17 Последняя добраемая инструкция метода должна быть либо обратной goto , либо ветвью, return или инструкцией throw . Не должно быть возможно оставить массив insns внизу.
B18 Незначенная половина бывшей пары регистрации не может быть прочитана (считается недействительной) до тех пор, пока она не будет переизведена какой-либо другой инструкцией.
Б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 .
B21 Инструкция move-exception должна появляться только в качестве первой инструкции в обработчике исключений.
B22 packed-switch-data , sparse-switch-data и псевдо-инструктивы fill-array-data не должны быть достигнуты при потоке управления.