特定のバイトコード命令でのみ発生するアプリケーション (soot を使用してバイトコードを処理する) のバグを特定しました。
その特定のケースのテストを作成したいと思います。ただし、期待されるバイトコードにコンパイルされるテストコードを確実に作成することはできません。これにより、バグがトリガーされます。
これは、バグをトリガーする私の試みです:
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);
}
}
問題は、コンパイラが比較を反転し、2 つの分岐を切り替えることによって分岐ロジックを変更することです。以下のバイトコードでわかるように、 の!=
代わりに比較を行い==
ます。ただし、私がテストしているバグは、==
.
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コンパイラ、そのバージョンなどがある場合、これはまったく可能ですか?