ASM 文档说标签代表一个基本块,它是控制图中的一个节点。所以我visitLabel
在这个简单的例子上测试了这个方法:
public static void main(String[] args) {
int x = 3, y = 4;
if (x < y) {
x++;
}
}
对于该visitLabel
方法,我使用本机 API: 对其进行检测setID(int id)
,其中 id 是增量的。在此示例中,CFG 应具有 3 个节点:一个位于开头,一个用于 if 语句的每个分支。所以我希望setID
会在 3 个位置被调用。但是,它被调用了5次,并且有很多nop
指令。有人可以为我解释为什么吗?
这是上述程序的检测字节码。
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: invokestatic #13 // Method setId:(I)V
4: iconst_3
5: istore_1
6: iconst_3
7: invokestatic #13 // Method setId:(I)V
10: iconst_4
11: istore_2
12: iconst_4
13: invokestatic #13 // Method setId:(I)V
16: iload_1
17: iload_2
18: if_icmpge 28
21: iconst_5
22: invokestatic #13 // Method setId:(I)V
25: iinc 1, 1
28: bipush 6
30: invokestatic #13 // Method setId:(I)V
33: return
34: nop
35: nop
36: nop
37: nop
38: athrow
我不明白为什么label
每条istore
指令前都有一个。没有分支使其成为 CFG 中的新节点。