(0) Obligation:
JBC Problem based on JBC Program:
public class Choose {
public static void main(String[] args) {
int i = 3;
while (i >= 3) {
if (i > 5)
i += 3;
else if (i > 10)
i -= 2;
else
i++;
}
}
}
(1) JBCNonTerm (EQUIVALENT transformation)
Reached a loop using the following run:
0:
java.lang.String = serialPersistentFields, CASE_INSENSITIVE_ORDER
[a273928(lv_0_0)]
<Choose.main||0: push 3|| - || ->
String.serialVersionUID: iconstLong_-6849794470754667710
String.serialPersistentFields: a273930
String.CASE_INSENSITIVE_ORDER: o136965
String$CaseInsensitiveComparator.serialVersionUID: iconstLong_8575799808933029326
RuntimeException.serialVersionUID: iconstLong_-7034897190745766939
Exception.serialVersionUID: iconstLong_-3387516993124229948
Throwable.serialVersionUID: iconstLong_-3042686055658047285
i1: [0,+inf){0,+inf}
a273928([java.lang.String...]): length i1
a273930([java.io.ObjectStreamField|]): length iconst_0
o136965!: String$CaseInsensitiveComparator()
Relations:
1:
java.lang.String = serialPersistentFields, CASE_INSENSITIVE_ORDER
[a273928(lv_0_0)]
<Choose.main||1: store INT to #1|| - ||iconst_3>
String.serialVersionUID: iconstLong_-6849794470754667710
String.serialPersistentFields: a273930
String.CASE_INSENSITIVE_ORDER: o136965
String$CaseInsensitiveComparator.serialVersionUID: iconstLong_8575799808933029326
RuntimeException.serialVersionUID: iconstLong_-7034897190745766939
Exception.serialVersionUID: iconstLong_-3387516993124229948
Throwable.serialVersionUID: iconstLong_-3042686055658047285
i1: [0,+inf){0,+inf}
a273928([java.lang.String...]): length i1
a273930([java.io.ObjectStreamField|]): length iconst_0
o136965!: String$CaseInsensitiveComparator()
Relations:
2:
java.lang.String = serialPersistentFields, CASE_INSENSITIVE_ORDER
[a273928(lv_0_0)]
<Choose.main||2: load INT #1||#1: iconst_3|| ->
String.serialVersionUID: iconstLong_-6849794470754667710
String.serialPersistentFields: a273930
String.CASE_INSENSITIVE_ORDER: o136965
String$CaseInsensitiveComparator.serialVersionUID: iconstLong_8575799808933029326
RuntimeException.serialVersionUID: iconstLong_-7034897190745766939
Exception.serialVersionUID: iconstLong_-3387516993124229948
Throwable.serialVersionUID: iconstLong_-3042686055658047285
i1: [0,+inf){0,+inf}
a273928([java.lang.String...]): length i1
a273930([java.io.ObjectStreamField|]): length iconst_0
o136965!: String$CaseInsensitiveComparator()
Relations:
Start state of loop:
java.lang.String = serialPersistentFields, CASE_INSENSITIVE_ORDER
[a24(lv_0_0)]
<Choose.main||2: load INT #1||#1: i12|| ->
String.serialVersionUID: iconstLong_-6849794470754667710
String.serialPersistentFields: a23
String.CASE_INSENSITIVE_ORDER: o12
String$CaseInsensitiveComparator.serialVersionUID: iconstLong_8575799808933029326
RuntimeException.serialVersionUID: iconstLong_-7034897190745766939
Exception.serialVersionUID: iconstLong_-3387516993124229948
Throwable.serialVersionUID: iconstLong_-3042686055658047285
a23([java.io.ObjectStreamField|]): length iconst_0
o12!: String$CaseInsensitiveComparator()
i1: [0,+inf){0,+inf}
a24([java.lang.String...]): length i1
i12: [3,+inf)(4){1,+inf}
Relations:
In the loop head node, references [i12] were interesting.
By SMT, we could prove
((3 <= initial_i12 and 0 <= initial_i1) and (((path1_i12 = path1_i17 and path1_i18 = (path1_i17 + 3) and path1_i18 = res_i12 and path1_i1 = res_i1 and path1_i12 = initial_i12 and path1_i1 = initial_i1) and (path1_i12 >= 3 and T and path1_i17 > 5)) and ((res_i12 = res_i17 and res_i18 = (res_i17 + 3)) and !(res_i12 >= 3 and T and res_i17 > 5))))
to be UNSAT. Consequently, the loop will not terminate.