我正在Findbugs中編寫自定義檢測器。我想知道是否有什麼方法可以跟蹤ASTORE及相應的ALOAD指令?也就是說,如果ASTORE 3在我的字節碼出現,我想先確定它是一個ASTORE指令,然後它指數(在這種情況下:3),並尋找ALOAD具有相同指數的指令(在這種情況下, ALOAD 3指令)。Findbugs:自定義檢測器
例如在字節碼如下所示,我想讀ASTORE 8指令(出現在導線#29),並查看是否有任何ALOAD指令與索引 。 I.e,ALOAD 8(可在#73行上看到)。
29: astore 8
31: aload_1
32: iconst_0
.
.
.
.
.
.
60: ldc #54 // String number
62: aload 11
64: invokeinterface #56, 3 // InterfaceMethod javax/servlet/http/HttpSession.setAttribute:(Ljava/lang/String;Ljava/lang/Object;)V
69: aload 12
71: aload 7
73: aload 8
75: invokeinterface #62, 3 // InterfaceMethod com/ibm/itim/ws/services/WSSessionService.getNumber:(Ljava/lang/String;Ljava/lang/String;)Lcom/ibm/itim/ws/model/WSSession;
80: astore 14
此外,如果我找到相應的ALOAD指令,那麼我想檢查哪個方法被調用。我知道可以使用sawOpcode()方法進行檢查,如下所示:
if (seen == INVOKEINTERFACE){...}
總之,我想要做這樣的事情:
僞代碼
public void sawOpcode(int seen) {
if (seen == ASTORE){
//code to identify its index i; i.e, ASTORE i
if(seen == ALOAD_i){
//if the corresponding ALOAD instruction is found...
if(seen == INVOKEINTERFACE){
// Identify the method invoked
}
}
不要知道上述方法是否正確。
作爲FindBugs的開發者,我可以幫你,但是現在你的問題有點含糊。我想你不會對每一個ASTORE感興趣,而是尋找一些特定的情況(例如,特定字符串的ASTORE,或者空的ASTORE,或之前GETFIELD或以前方法調用的結果的ASTORE)。你能更準確地描述這一部分:你在尋找哪些價值?請注意,即使您配對了,也並不意味着您加載了與分支目標相同的值(循環開始等)。通常值應該被跟蹤,而不是寄存器。 –
我正在尋找特定字符串的ASTORE。例如。 String name = request.getParameter(「name」)。該語句在字節碼中被翻譯爲「ALOAD 1. LDC」name「。 INVOKEINTERFACE。 ASTORE 7'。現在我想跟蹤這個ASORE 7找到ALOAD 7. @Tagir – Manoj
我編輯了我的答案並提供了更詳細的示例。隨意問你是否仍有問題。 –