Файл .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 | |
| G5 | |
| G6 | endian_tag должен иметь значение ENDIAN_CONSTANT или REVERSE_ENDIAN_CONSTANT |
| G7 | Для каждой из разделов Поля |
| 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 | Для каждого Для каждого Для указанного |
| 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 | |
| G5 | |
| G6 | endian_tag должен иметь значение ENDIAN_CONSTANT или REVERSE_ENDIAN_CONSTANT |
| G7 | Для каждой из разделов Поля |
| 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 | Для каждого Для каждого Для указанного |
| 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 | |
| G5 | |
| G6 | endian_tag должен иметь значение ENDIAN_CONSTANT или REVERSE_ENDIAN_CONSTANT |
| G7 | Для каждой из разделов Поля |
| 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 | Для каждого Для каждого Для указанного |
| 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 | |
| G5 | |
| G6 | endian_tag должен иметь либо значение: ENDIAN_CONSTANT или REVERSE_ENDIAN_CONSTANT |
| G7 | Для каждой из Поля |
| 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 | Для каждой Для каждой Для ссылки на |
| 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 не должны быть достигнуты при потоке управления. |