Как проверить стек с помощью посетителя ASM? - PullRequest
2 голосов
/ 05 декабря 2009

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

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

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

Есть ли способ использовать ASM для проверки переменных в стеке?

Ответы [ 2 ]

5 голосов
/ 05 декабря 2009

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

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

0 голосов
/ 05 декабря 2009

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

...