0

我正在嘗試使用ASM字節碼樹API進行Java代碼的靜態分析。 我有一個ClassNode cn,MethodNode m和該方法中的指令列表說InsnList列表。變量定義和賦值檢測asm字節碼

假設對於給定的指令(即AbstractInsnNode),我需要在上面的指令列表中找到變量的所有定義/賦值。爲了更清楚地說明,假設在第2行定義並初始化變量var,然後在第8行上分配其他值,然後在第12行上使用。在這種情況下,行號12是我的s。此外,假設大量的條件代碼在兩行之間。

這可能與ASM有關嗎?怎麼樣??

感謝和問候, SJ

爲了清楚起見,

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); 
    } 
} 

這裏,假設條件是JumpInsnNode(當前指令),我需要找到,如果(在哪裏)任何變量在條件(v.rank和numIter在這種情況下)被修改或分配在上面的代碼中的任何地方。保持簡單,僅僅是成員變量(沒有靜態函數或委託給另一個類的功能)。

+0

對於簡單的情況可以做。它很快就會變得複雜,取決於你想要達到的目標。 – 2011-04-18 07:58:15

+0

我假設我們在這裏談到成員變量?你想要的一般是不可能的。您可以收集當前方法中引用此變量的putfield指令。但是你也必須考慮被調用的方法,並以某種方式訪問​​這個變量。由於重載,你必須在這裏考慮來自編譯時類型類以及任何重載類的所有成員。 – Ingo 2011-04-18 09:52:00

+0

是的,我只想要僅僅是成員變量的簡單情況。如何收集當前方法中引用此變量的putfield指令。實際上,我目前的陳述可能有一個或多個變量,我怎麼知道每個變量。 – dreamer13134 2011-04-18 15:06:55

回答

1

SourceInterpreter計算每個Frame用於MethodNode相應的指令SourceValue小號 。基本上它可以告訴哪些指令可以將值賦給給定的變量或堆棧槽。

有關ASM analysis軟件包的更多信息,另請參閱ASM User Guide

但是,如果您只需要檢測是否分配了某個變量,那麼您所要做的就是查找帶有相應變量索引的xSTORE指令。

+0

非常感謝尤金。我正在使用分析包(tree.analysis)。但是,我的基本問題是,假設我有if(v.rank> 1 || numIter> 200)作爲條件,這是與跳轉語句對應的AbstractInsnNode,我如何確定正在接受/比較哪些變量這個條件(在這種情況下v。rank和numIter)。一旦我明白了,就像你剛纔提到的那樣,爲這些變量索引尋找xSTORE是顯而易見的。 – dreamer13134 2011-04-20 21:05:39

+0

對於給定的if()語句,字節碼中會有多條指令。每個跳轉指令都會在堆棧中有一個值,因此您首先需要解釋該值並查看其來源(即值從一些變量加載或通過其他指令放置到堆棧,例如,方法調用或其他一些指令)。 – 2011-04-21 15:20:23

+0

感謝尤金。我設法弄清楚了。 – dreamer13134 2011-04-21 21:55:20