Подтвердить что ты не робот

Обязанности верификатора байт-кода JVM

Может ли кто-нибудь просмотреть основные задачи, которые должен выполнять верификатор байт-кода, чтобы гарантировать правильность программы? Существует ли стандартная минимальная совокупность обязанностей, определенных в спецификации JVM? Я также задавался вопросом, распространяется ли проверка на другие этапы, такие как загрузка и инициализация.

4b9b3361

Ответ 1

Это указано в Спецификации JVM: Глава 4.10. Проверка файлов классов.

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

Другие вещи, которые он проверяет, включают, но не ограничиваются следующим:

  • Филиалы должны находиться в пределах массива кода для метода.

  • Целями всех команд управления потоком являются начало инструкции. В случае широкой инструкции широкий код операции считается началом инструкции, а код операции, дающий операцию, измененную этой широкой инструкцией, не считается началом инструкции. Филиалы в середине инструкции не разрешены.

  • Никакая команда не может получить доступ или изменить локальную переменную с индексом, большим или равным количеству локальных переменных, которые его метод указывает, что он выделяет.

  • Все ссылки на пул констант должны соответствовать записи соответствующего типа. (Например, команда getfield должна ссылаться на поле.)

  • Код не заканчивается в середине инструкции.

  • Выполнение не может упасть с конца кода.

  • Для каждого обработчика исключений начальная и конечная точка кода, защищенного обработчиком, должны быть в начале инструкции или, в случае конечной точки, непосредственно за концом кода. Начальная точка должна быть до конечной точки. Код обработчика исключений должен начинаться с действительной команды и не должен начинаться с кода операции, который изменяется с помощью широкой инструкции.

В качестве последнего шага верификатор также выполняет анализ потока данных, который гарантирует, что никакая команда не ссылается на любые неинициализированные локальные переменные.

Ответ 2

В качестве альтернативы вы можете взглянуть на технический документ Java Language Environment Джеймса Гослинга.

![enter image description here

Верификатор байт-кода проходит через байт-коды, создает информацию о состоянии типа и проверяет типы параметров для всех инструкций байт-кода.

На рисунке показан поток данных и управления из исходного кода языка Java через компилятор Java, к загрузчику классов и верификатору байт-кода и, следовательно, к виртуальной машине Java, которая содержит интерпретатор и систему времени выполнения. Важная проблема заключается в том, что загрузчик классов Java и верификатор байт-кода не делают никаких предположений относительно первоисточника потока байт-кода - возможно, код поступил из локальной системы или он переместился на полпути вокруг планеты. Верификатор байт-кода действует как своего рода привратник: он гарантирует, что код, передаваемый интерпретатору Java, находится в состоянии готовности к выполнению и может выполняться без опасения нарушения работы интерпретатора Java. Импортированный код не может быть выполнен каким-либо образом до тех пор, пока он не пройдет тесты верификатора. Когда верификатор завершен, известен ряд важных свойств:

  • Нет операндов или переполнения
  • Известно, что типы параметров всех инструкций байт-кода всегда являются правильными
  • Доступ к полям объекта известен как законный - частный, публичный или защищенный

Несмотря на то, что вся эта проверка представляется чрезвычайно детализированной, к тому времени, когда верификатор байт-кода выполнит свою работу, интерпретатор Java может продолжить, зная, что код будет работать безопасно. Знание этих свойств делает интерпретатор Java намного быстрее, потому что он не должен ничего проверять. Нет проверок типа операнда и. Таким образом, переводчик может работать на полной скорости без ущерба для надежности.

Ответ 3

Он выполняет следующие действия:

  • Нет операндов или нижних потоков
  • Типы параметры всех инструкций байткода, как известно, всегда правильно
  • Доступ к полям объектов, как известно, является законным - частным, публичный или защищенный.

Ссылка: http://java.sun.com/docs/white/langenv/Security.doc3.html