Как проверить стек с помощью ASM visitor?
-
13-09-2019 - |
Вопрос
Я пытаюсь использовать инженерную библиотеку 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 соответствуют объявлениям переменных.