【发布时间】:2015-08-15 16:52:06
【问题描述】:
我正在 Findbugs 中编写自定义检测器。我想知道是否有任何方法可以跟踪 ASTORE 和相应的 ALOAD 指令?也就是说,如果 ASTORE 3 出现在我的字节码中,我想首先确定它是一个 ASTORE 指令,然后是它的 index (在这种情况下:3 ) 并寻找具有相同索引的 ALOAD 指令(在本例中为 ALOAD 3 指令)。
例如在下面显示的字节码中,我想读取 ASTORE 8 指令(出现在第 29 行),看看是否有任何 ALOAD 指令与索引 8。即,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,或 null 的 ASTORE,或先前 GETFIELD 或先前方法调用的结果的 ASTORE)。您能否更准确地描述这部分:您正在寻找哪些价值观?请注意,即使您已配对 ALOAD,这并不意味着您加载的值与可能存在分支目标(循环开始等)相同。通常应该跟踪值,而不是寄存器。
-
我正在寻找特定字符串的 ASTORE。例如。字符串名称 = request.getParameter("name")。该语句在字节码中被翻译为
ALOAD 1. LDC "name". INVOKEINTERFACE. ASTORE 7。现在我想跟踪这个 ASORE 7 以找到 ALOAD 7。@Tagir -
我编辑了我的答案并提供了更详细的示例。如果您还有问题,请随时询问。