Файл .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 не должны быть достигнуты при потоке управления. |