Pergunta

Eu estou tentando usar a biblioteca de engenharia de código Java byte ASM para realizar a análise estática. Tenho a situação em que eu gostaria de inspecionar as variáveis ??que está sendo atribuído a um campo.

Eu tenho MethodVisitor que implementa o método visitFieldInsn(). Estou procurando especificamente para o comando putfield. Isso não é problema. O problema é que quando eu encontrar putfield, eu quero ser capaz de acessar a variável que vai ser atribuído ao campo. Especificamente eu quero acessar informações sobre o tipo da variável.

No momento, eu realmente só precisa de olhar para o que está no topo da pilha, mas se há uma maneira mais geral para inspecioná-lo que é ainda melhor.

Existe uma maneira usando ASM para inspecionar as variáveis ??na pilha?

Foi útil?

Solução

Em primeiro lugar, se você pode assumir que bytecode é válido, o tipo de valor atribuído a um campo deve corresponder ao tipo de campo, que você pode ler com antecedência usando ClassReader API.

No entanto, se você precisa controlar onde cada valor individual em uma pilha ou slot variável para um dado ponteiro de instrução veio, você pode usar a API Analyzer com SourceInterpreter. Basicamente, ele permitiria encontrar instrução que produziu valor dado e você pode usar informações sobre a instrução para deduzir um tipo (por exemplo, se ele lê a partir de uma variável que corresponde a um parâmetro de método ou se o valor foi retornado de uma chamada de método, assim, em ambos casos, você pode obter o tipo de descritor de método). ver também o meu post antigo que tem um exemplo de usar SourceInterpreter .

Outras dicas

Eu não estou familiarizado com ASM, mas eu tenho feito algo que soa semelhante com a estrutura Eclipse Java AST. Para saber sobre variáveis, eu tive que manter o controle de declarações de variáveis-me no apropriado visitX () métodos do visitante AST. Não foi muito difícil uma vez que eu sabia que nós AST correspondeu declarações de variáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top