java字节码数据分析

问题描述 投票:0回答:1

我正在开发一个java字节码分析项目,它是用c编写的

当前阶段是编写一个堆栈模拟器来模拟jvm虚拟机中正在执行的类文件的状态。

处理完各个方法的基本块,并创建控制流图后, 我发现了一个问题,这是我的猜测:

  • 每个基本块执行完后栈是否为空?
  • 或者当每个分支收敛时,无论哪个分支到 下一个基本块,堆栈上的内容将是相同
jvm data-analysis bytecode
1个回答
0
投票

每个基本块执行完后栈是否为空?

这在第 2.6.4 节中指定。 JVM 规范的正常方法调用完成

在这种情况下,当前帧(§2.6)用于恢复调用者的状态,包括其局部变量和操作数堆栈,调用者的程序计数器适当递增以跳过方法调用指令。

因此,返回时,需要清理堆栈以确保推送到其中的任何内容都会弹出。

但是,JVM 本身并没有块的概念,这只存在于 Java 语言中(字节码中也有

goto
指令)。因此,该语言可以生成字节码,在返回时将元素留在堆栈上,并且 JVM 应该清理它。

但是,对于其他块,需要确保类型检查仍然有效。它没有执行路径,您可能是例如按我的理解,推动

int
,然后将其视为
boolean

我认为规范的相关部分应该在4.10.1.6中。使用代码进行类型检查方法:

合并的代码流相对于传入类型状态 T 是类型安全的,如果它以相对于 T 类型安全的指令 I 开头,并且 I 满足其异常处理程序(见下文),并且流的尾部是类型安全的给定 I 执行后的类型状态。

NextStackFrame
表示以下指令的内容。对于无条件分支指令,afterGoto 具有特殊值。 ExceptionStackFrame 指示传递给异常处理程序的内容。

关于

或者说每个分支收敛的时候,无论哪一个分支走到下一个基本块,栈上的内容都是一样的

我认为它不需要完全相同,但它不应该导致类型检查违规。如果没有,类文件验证可能会失败。

© www.soinside.com 2019 - 2024. All rights reserved.