0

J'essaie d'utiliser l'API ASM bytecode tree pour l'analyse statique du code Java. J'ai un ClassNode cn, MethodNode m et la liste des instructions dans cette méthode dit InsnList list. Supposons que pour une instruction donnée (c'est-à-dire AbstractInsnNode) s, j'ai besoin de trouver toutes les définitions/affectations de la variable en s dans la liste d'instructions ci-dessus. Pour le rendre plus clair, supposons qu'une variable var soit définie et initialisée sur la ligne 2, puis assignée une autre valeur sur la ligne numéro 8 et ensuite utilisée sur la ligne numéro 12. La ligne numéro 12 est ma s, dans ce cas. En outre, supposons beaucoup de code conditionnel dans les lignes entre.définition de variable et affectation de détection asm bytecode

Est-ce possible avec ASM? Comment??

Merci et salutations, SJ

Pour plus de clarté,

public void funcToAnalyze(String k, SomeClass v) { 
      int numIter = 0; 

      /* 
       Do cool stuff here.... modifies member variables and passed params too 
      */ 

    if (v.rank > 1 || numIter>200) { 
     magicFunction(k, 1); 
    } 
} 

Ici, supposons que le conditionnel est le JumpInsnNode (instruction en cours) et je dois trouver si (et où) l'une des variables dans le conditionnel (v.rank et numIter dans ce cas) sont modifiés ou assignés n'importe où dans le code ci-dessus. Restez simple, juste des variables membres (pas de fonction statique ou de délégation à la fonction d'une autre classe).

+0

Il est possible de faire pour les cas simples. Cela devient compliqué juste assez rapidement en fonction de ce que vous essayez d'atteindre. –

+0

Je suppose que nous parlons de variables membres ici? Ce que vous voulez est en général impossible. Vous pouvez collecter les instructions putfield qui se réfèrent à cette variable dans la méthode actuelle. Mais vous devez aussi considérer les méthodes qui sont appelées et qui peuvent avoir accès à cette variable. En raison de la surcharge, vous devez considérer ici tous les membres de la classe de type heure de compilation ainsi que de toute classe de remplacement. – Ingo

+0

Oui, je veux juste le cas simple des variables membres seulement. Comment puis-je collecter les instructions putfield qui se réfèrent à cette variable dans la méthode actuelle. Acuellement, mes déclarations actuelles, peuvent avoir une ou plusieurs variables comment puis-je connaître chacun. – dreamer13134

Répondre

1

Le SourceInterpreterSourceValue calcule pour chaque s Frame pour une instruction correspondant à MethodNode. Fondamentalement, il indique quelles instructions peuvent placer une valeur dans une variable donnée ou un emplacement de pile. Pour plus d'informations sur le package ASM analysis, reportez-vous également au .

Cependant, si vous avez juste besoin de détecter si une certaine variable a été affectée, alors tout ce que vous avez à faire est de rechercher les instructions xSTORE avec les index de variable correspondants.

+0

Merci beaucoup Eugene. J'utilise le package d'analyse (tree.analysis). Cependant, ma question fondamentale est, supposons que j'ai (v.rank> 1 || numIter> 200) comme conditionnel, ceci est le AbstractInsnNode correspondant à l'instruction jump, comment puis-je déterminer quelles variables sont accédées/comparées dans ce conditionnel (v. rank et numIter dans ce cas). Une fois cela obtenu, il serait évident de chercher simplement xSTORE pour ces index de variables comme vous l'avez mentionné. – dreamer13134

+0

Il y aura plus d'une instruction dans le bytecode pour une instruction if() donnée. Chaque instruction de saut aura une valeur sur la pile, donc vous devrez d'abord interpréter cette valeur et voir d'où elle vient (c.-à-d.valeur chargée à partir d'une variable ou placée dans la pile par une autre instruction, par ex. un appel de méthode ou d'autres instructions). –

+0

remercie Eugene. J'ai réussi à comprendre. – dreamer13134

Questions connexes