【发布时间】:2013-05-15 13:26:18
【问题描述】:
我在我的应用程序(使用烟灰处理字节码)中发现了一个仅在特定字节码指令上出现的错误。
我想为该特定案例创建一个测试。但是,我无法可靠地编写测试代码,它将编译为预期的字节码,然后会触发错误。
这是我触发错误的尝试:
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 编译器、版本等,这是否可能?
【问题讨论】: