【发布时间】:2016-10-26 11:50:29
【问题描述】:
背景:
在问我的问题之前,我想声明我已经检查了以下链接:
Identify loops in java byte code
http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html
我可以使用基于支配分析算法的方法检测控制流图 (https://en.wikipedia.org/wiki/Control_flow_graph) 上的反向边缘,从而检测字节码(类文件)中的循环。
我的问题:
检测到循环后,您最终可能会有两个循环(由两个不同的后边缘定义)共享同一个循环头。正如我所意识到的,这可以通过以下两种情况创建:(案例 1)在源代码中,您有一个带有 continue 语句的 for 或 while 循环,(案例 2)在源代码中,您有两个循环 - 一个外循环是一个do-while和一个内循环;并且这些循环之间没有指令。
我的问题如下:只看字节码,如何区分这两种情况?
我的想法:
在 do-while 循环中(即没有任何 continue 语句),您不会期望 go-to 语句返回到循环头部,换句话说,不会创建后沿。
对于 while 或 for 循环(也就是没有任何 continue 语句),似乎可以有一个 go-to 语句(我不确定是否必须是一个)。我的编译器在循环之外生成(我使用的是标准 1.7 编译器)这个 go-to 指令,而不是作为给定链接中提到的后沿(这个 go-to 语句创建到头部的控制流循环,但不是从循环末尾跳回)。
所以,我的猜测是,(重复,如果有两个后沿),如果其中一个是由 go-to 语句创建的后沿,那么源代码中只有一个循环,它包括一个continue 语句(案例 1)。否则,源代码中有两个循环(案例2)。
谢谢。
【问题讨论】:
标签: java loops bytecode goto continue