Question

Je cherche à utiliser la bibliothèque d'ingénierie de byte code Java ASM pour effectuer une analyse statique. J'ai la situation où je voudrais vérifier les variables étant affecté à un champ.

Je MethodVisitor qui met en œuvre la méthode visitFieldInsn(). Je suis à la recherche spécifiquement pour la commande putfield. Ce n'est pas un problème. Le problème est que quand je rencontre putfield, je veux être en mesure d'accéder à la variable qui va être affecté au champ. Plus précisément, je veux accéder à des informations sur le type de la variable.

En ce moment je vraiment besoin de regarder ce qui est en haut de la pile, mais s'il y a une façon plus générale pour l'inspecter qui est encore mieux.

Est-il possible en utilisant ASM pour inspecter les variables sur la pile?

Était-ce utile?

La solution

Tout d'abord, si vous pouvez supposer que bytecode est valide, le type de valeur attribuée à un champ doit correspondre au type de terrain, que vous pouvez lire à l'avance en utilisant l'API de ClassReader.

Toutefois, si vous devez suivre où chaque valeur individuelle sur une pile ou une fente variable pour pointeur d'instruction donnée est venu, vous pouvez utiliser l'API Analyzer avec SourceInterpreter. Fondamentalement, il permettrait de trouver l'instruction qui a produit la valeur donnée et vous pouvez utiliser des informations sur cette instruction pour en déduire un type (par exemple, si elle se lit d'une variable qui correspond à un paramètre de méthode ou si la valeur été renvoyée par un appel de méthode, à la fois cas, vous pouvez obtenir le type de descripteur de méthode). Voir aussi mon ancien billet de blog qui a exemple d'utilisation SourceInterpreter.

Autres conseils

Je ne suis pas familier avec ASM, mais je l'ai fait quelque chose qui semble similaire avec le framework Eclipse Java AST. Pour en savoir sur les variables, je devais garder une trace de déclarations variables moi-même dans les méthodes appropriées (visitX) du visiteur AST. Il n'a pas été très difficile une fois que je savais quels noeuds AST correspondaient à des déclarations de variables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top