我在我的应用程序(使用烟灰处理字节码)中发现了一个仅在特定字节码指令上出现的错误。
我想为该特定案例创建一个测试。但是,我无法可靠地编写测试代码,它将编译为预期的字节码,然后会触发错误。
这是我触发错误的尝试:
public void updateRhsOnIfEq() {
int x = 15;
int y = AircraftControl.readSensor(0);
// FIXME != in bytecode instead of ==
if (x == y) {
AircraftControl.readSensor(y);
}
else {
AircraftControl.readSensor(x);
}
}
问题是,编译器通过反转比较和切换两个分支来更改分支逻辑。正如您在下面的字节码中看到的那样,它进行!=
比较而不是==
. 但是,我正在测试的错误仅由==
.
public void updateRhsOnIfEq();
0 bipush 15
2 istore_1 [x]
3 iconst_0
4 invokestatic AircraftControl.readSensor(int) : int [17]
7 istore_2 [y]
8 iload_1 [x]
9 iload_2 [y]
10 if_icmpne 21 <============================== Should be if_icmpeq
13 iload_2 [y]
14 invokestatic AircraftControl.readSensor(int) : int [17]
17 pop
18 goto 26
21 iload_1 [x]
22 invokestatic AircraftControl.readSensor(int) : int [17]
25 pop
26 return
有没有办法编写需要轻松生成可预测字节码的测试用例?鉴于存在不同的 Java 编译器、其版本等,这是否可能?