5.53/2.34 NO 5.79/2.37 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 5.79/2.37 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 5.79/2.37 5.79/2.37 5.79/2.37 termination of the given Bare JBC problem could be disproven: 5.79/2.37 5.79/2.37 (0) Bare JBC problem 5.79/2.37 (1) BareJBCToJBCProof [EQUIVALENT, 95 ms] 5.79/2.37 (2) JBC problem 5.79/2.37 (3) JBCNonTerm [COMPLETE, 348 ms] 5.79/2.37 (4) NO 5.79/2.37 5.79/2.37 5.79/2.37 ---------------------------------------- 5.79/2.37 5.79/2.37 (0) 5.79/2.37 Obligation: 5.79/2.37 need to prove termination of the following program: 5.79/2.37 package simple.cousot; 5.79/2.37 5.79/2.37 public class Cousot { 5.79/2.37 5.79/2.37 public static void loop(int i, int j) { 5.79/2.37 while (true) { 5.79/2.37 if (i < j) { 5.79/2.37 i = i+4; 5.79/2.37 } else { 5.79/2.37 j = j+1; 5.79/2.37 i = i+2; 5.79/2.37 } 5.79/2.37 } 5.79/2.37 } 5.79/2.37 } 5.79/2.37 5.79/2.37 5.79/2.37 package simple.cousot; 5.79/2.37 5.79/2.37 public class Main { 5.79/2.37 5.79/2.37 /** 5.79/2.37 * @param args 5.79/2.37 */ 5.79/2.37 public static void main(String[] args) { 5.79/2.37 Cousot.loop(args[0].length(), args[1].length()); 5.79/2.37 } 5.79/2.37 5.79/2.37 } 5.79/2.37 5.79/2.37 5.79/2.37 5.79/2.37 ---------------------------------------- 5.79/2.37 5.79/2.37 (1) BareJBCToJBCProof (EQUIVALENT) 5.79/2.37 initialized classpath 5.79/2.37 ---------------------------------------- 5.79/2.37 5.79/2.37 (2) 5.79/2.37 Obligation: 5.79/2.37 need to prove termination of the following program: 5.79/2.37 package simple.cousot; 5.79/2.37 5.79/2.37 public class Cousot { 5.79/2.37 5.79/2.37 public static void loop(int i, int j) { 5.79/2.37 while (true) { 5.79/2.37 if (i < j) { 5.79/2.37 i = i+4; 5.79/2.37 } else { 5.79/2.37 j = j+1; 5.79/2.37 i = i+2; 5.79/2.37 } 5.79/2.37 } 5.79/2.37 } 5.79/2.37 } 5.79/2.37 5.79/2.37 5.79/2.37 package simple.cousot; 5.79/2.37 5.79/2.37 public class Main { 5.79/2.37 5.79/2.37 /** 5.79/2.37 * @param args 5.79/2.37 */ 5.79/2.37 public static void main(String[] args) { 5.79/2.37 Cousot.loop(args[0].length(), args[1].length()); 5.79/2.37 } 5.79/2.37 5.79/2.37 } 5.79/2.37 5.79/2.37 5.79/2.37 5.79/2.37 ---------------------------------------- 5.79/2.37 5.79/2.37 (3) JBCNonTerm (COMPLETE) 5.79/2.37 Reached a loop using the following run: 5.79/2.37 5.79/2.37 0: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 1: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 2: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 3: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 4: 5.79/2.37 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 5: 5.79/2.37 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 6: 5.79/2.37 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 7: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 8: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 9: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 a2([java.lang.String...]): {o15, o37} -->{java.lang.Object...} 5.79/2.37 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 o16:: [CHAR] -->{java.lang.Object...} 5.79/2.37 a2-><-o38 5.79/2.37 a2-><-o37 5.79/2.37 a2-><-o16 5.79/2.37 a2-><-o15 5.79/2.37 YES: (JL1) 5.79/2.37 10: 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 YES: (JL1) 5.79/2.37 11: 5.79/2.37 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 YES: (JL1) 5.79/2.37 12: 5.79/2.37 5.79/2.37 o37!: String(count=1, hash=#, offset=0, value=o38?) -->{java.lang.Object...} 5.79/2.37 o38:: [CHAR] -->{java.lang.Object...} 5.79/2.37 YES: (JL1) 5.79/2.37 13: 5.79/2.37 5.79/2.37 YES: (JL1) 5.79/2.37 14: 5.79/2.37 YES: (JL1) 5.79/2.37 15: 5.79/2.37 5.79/2.37 YES: (JL1) 5.79/2.37 Start state of loop: 5.79/2.37 5.79/2.37 5.79/2.37 [a2(lv_0_0)] 5.79/2.37 5.79/2.37 a2([java.lang.String...]): length i16 -->{java.lang.Object...} 5.79/2.37 i13: [0,+inf) 5.79/2.37 i16: [2,+inf){0,+inf} 5.79/2.37 i30: [0,+inf) 5.79/2.37 YES: (JL1) 5.79/2.37 5.79/2.37 5.79/2.37 In the loop head node, references [i13, i30] were interesting. 5.79/2.37 5.79/2.37 All methods calls in the loop body are side-effect free, hence they can be ignored. 5.79/2.37 5.79/2.37 By SMT, we could prove 5.79/2.37 5.79/2.37 ((0 <= initial_i13 and 0 <= initial_i30 and 2 <= initial_i16) and ((((path1_i36 = (path1_i13 + 4) and path1_i36 = res_i13 and path1_i30 = res_i30 and path1_i13 = initial_i13 and path1_i30 = initial_i30) and (path1_i13 < path1_i30 and path1_i13 < path1_i30)) or ((path2_i34 = (path2_i30 + 1) and path2_i67 = (path2_i13 + 2) and path2_i67 = res_i13 and path2_i34 = res_i30 and path2_i13 = initial_i13 and path2_i30 = initial_i30) and (path2_i13 >= path2_i30 and path2_i13 >= path2_i30))) and (((res1_i36 = (res1_i13 + 4) and res_i13 = res1_i13 and res_i30 = res1_i30) and !(res1_i13 < res1_i30 and res1_i13 < res1_i30)) and ((res2_i34 = (res2_i30 + 1) and res2_i67 = (res2_i13 + 2) and res_i13 = res2_i13 and res_i30 = res2_i30) and !(res2_i13 >= res2_i30 and res2_i13 >= res2_i30))))) 5.79/2.37 5.79/2.37 to be UNSAT. Consequently, the loop will not terminate. 5.79/2.37 ---------------------------------------- 5.79/2.37 5.79/2.37 (4) 5.79/2.37 NO 5.81/2.41 EOF