Вопрос

Я пытаюсь использовать инженерную библиотеку Java byte code engineering library ASM для выполнения статического анализа.У меня есть ситуация, когда я хотел бы проверить переменные, присваиваемые полю.

У меня есть MethodVisitor который реализует visitFieldInsn() способ.Я специально ищу putfield команда.Это не проблема.Проблема в том, что когда я сталкиваюсь putfield, Я хочу иметь возможность доступа к переменной, которая будет присвоена полю.В частности, я хочу получить доступ к информации о Тип переменной.

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

Есть ли способ с помощью ASM проверять переменные в стеке?

Это было полезно?

Решение

Прежде всего, если вы можете предположить, что байт-код допустим, тип значения, присвоенного полю, должен соответствовать типу поля, который вы можете прочитать заранее с помощью ClassReader API.

Однако, если вам нужно отследить, откуда взялось каждое отдельное значение в стеке или ячейке переменной для данного указателя инструкции, вы можете использовать Analyzer API с SourceInterpreter .В принципе, это позволило бы найти инструкцию, которая выдала заданное значение, и вы можете использовать информацию об этой инструкции для определения типа (напримересли он считывает из переменной, которая соответствует параметру метода, или если значение было возвращено из вызова метода, так что в обоих случаях вы можете получить тип из дескриптора метода).Также смотрите мой старый пост в блоге, в котором есть пример использования SourceInterpreter.

Другие советы

Я не знаком с ASM, но я сделал нечто похожее с Eclipse Java AST framework.Чтобы узнать о переменных, мне пришлось самому отслеживать объявления переменных в соответствующих методах visitX() посетителя AST.Это было не очень сложно, как только я узнал, какие узлы AST соответствуют объявлениям переменных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top