【发布时间】:2014-05-21 06:23:19
【问题描述】:
使用 ASM 字节码我们能否识别方法体中存在的 for 循环或 while 循环?
【问题讨论】:
-
你的标签没有意义。
-
所以你想要类似“如果字节 xyz 存在,它是一个 while 循环”之类的东西吗?
-
嗨 deviantfan,你是对的。
使用 ASM 字节码我们能否识别方法体中存在的 for 循环或 while 循环?
【问题讨论】:
这取决于您要提取哪些信息。原则上,您可以通过搜索后向分支来检测循环。如果没有通常的代码结构,循环就无法工作,您将找不到不属于循环的向后分支。
所以如果你想让它们显式命名,所有字节码指令goto、goto_w、if_acmpeq、if_acmpne、if_icmpeq、if_icmpge、if_icmpgt、if_icmple、 if_icmplt、if_icmpne、ifeq、ifge、ifgt、ifle、iflt、ifne、ifnonnull、ifnull 可能表示循环p>
但在大多数情况下,您将很难说出您拥有什么样的循环。编译代码中的for 循环和while 循环之间没有显着差异。例如,以下代码片段是完全等价的:
for(a();b();c()) {
d();
}
a();
for(;b();) {
d();
c();
}
a();
for(;;) {
if(!b()) break;
d();
c();
}
a();
while(b()) {
d();
c();
}
结构更复杂的情况会变得更糟,例如当您想确定指向同一代码位置的两个反向分支是否属于带有条件continue 语句的单个循环或两个嵌套循环时。事实证明这是不可能的。
【讨论】: