Почему проверка байт-кода выполняется в Java? - PullRequest
0 голосов
/ 23 мая 2018

Насколько я понимаю, до этой статьи авторы пишут, что главная цель - проверить, изменил ли кто-нибудь байт-код.Потому что «файл класса, сгенерированный компилятором для языка программирования Java, всегда проходит проверку».Является ли это единственной причиной, по которой у нас есть верификатор байт-кода, чтобы предотвратить злонамеренное изменение нашего байт-кода другими людьми?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

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

Если в результате один из используемых вами классов в итоге получит доступ к переменным, которые никогда не были должным образом определены, то это является нарушениемЯзык Java и платформа Java гарантируют, и Java больше не может гарантировать, что любая другая часть программы будет вести себя как обещано.

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

0 голосов
/ 23 мая 2018

файл класса, сгенерированный компилятором для языка программирования Java, всегда проходит проверку

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

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

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

0 голосов
/ 23 мая 2018

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

Полезно article .

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

Также даже в javac могут быть некоторые ошибки, поэтому даже он может выдавать недопустимые классы в качестве вывода.

...