Вопрос по jvm, java – Обязанности верификатора байт-кода JVM

18

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

Ваш Ответ

3   ответа
16

JVM Спецификация: глава 4.10. Проверка класса Файлы.

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

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

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

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

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

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

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

Исполнение не может выпасть из конца кода.

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

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

Включен ли верификатор Java при загрузке классов из локальной файловой системы? Например, когда Eclipse или Apache загружает класс, проверяется ли этот байт-код? Dinis Cruz
7

Java Language Environment Белая книга Джеймса Гослинга.

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

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

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

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

2

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

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

Похожие вопросы