5.58/2.35 NO 5.58/2.38 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 5.58/2.38 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 5.58/2.38 5.58/2.38 5.58/2.38 termination of the given Bare JBC problem could be disproven: 5.58/2.38 5.58/2.38 (0) Bare JBC problem 5.58/2.38 (1) BareJBCToJBCProof [EQUIVALENT, 94 ms] 5.58/2.38 (2) JBC problem 5.58/2.38 (3) JBCToGraph [EQUIVALENT, 252 ms] 5.58/2.38 (4) JBCTerminationGraph 5.58/2.38 (5) JBCNonTerm [COMPLETE, 258 ms] 5.58/2.38 (6) NO 5.58/2.38 5.58/2.38 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (0) 5.58/2.38 Obligation: 5.58/2.38 need to prove termination of the following program: 5.58/2.38 package simple.ex07; 5.58/2.38 5.58/2.38 public class Ex07 { 5.58/2.38 5.58/2.38 public static void loop(int i) { 5.58/2.38 while (true) { 5.58/2.38 if (i > 0) { 5.58/2.38 i--; 5.58/2.38 } 5.58/2.38 if (i < 0) { 5.58/2.38 i++; 5.58/2.38 } 5.58/2.38 } 5.58/2.38 } 5.58/2.38 } 5.58/2.38 5.58/2.38 5.58/2.38 package simple.ex07; 5.58/2.38 5.58/2.38 public class Main { 5.58/2.38 5.58/2.38 /** 5.58/2.38 * @param args 5.58/2.38 */ 5.58/2.38 public static void main(String[] args) { 5.58/2.38 int value = args[1].length(); 5.58/2.38 if (args[0].length() % 2 == 0) { 5.58/2.38 value = -value; 5.58/2.38 } 5.58/2.38 Ex07.loop(value); 5.58/2.38 5.58/2.38 } 5.58/2.38 5.58/2.38 } 5.58/2.38 5.58/2.38 5.58/2.38 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (1) BareJBCToJBCProof (EQUIVALENT) 5.58/2.38 initialized classpath 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (2) 5.58/2.38 Obligation: 5.58/2.38 need to prove termination of the following program: 5.58/2.38 package simple.ex07; 5.58/2.38 5.58/2.38 public class Ex07 { 5.58/2.38 5.58/2.38 public static void loop(int i) { 5.58/2.38 while (true) { 5.58/2.38 if (i > 0) { 5.58/2.38 i--; 5.58/2.38 } 5.58/2.38 if (i < 0) { 5.58/2.38 i++; 5.58/2.38 } 5.58/2.38 } 5.58/2.38 } 5.58/2.38 } 5.58/2.38 5.58/2.38 5.58/2.38 package simple.ex07; 5.58/2.38 5.58/2.38 public class Main { 5.58/2.38 5.58/2.38 /** 5.58/2.38 * @param args 5.58/2.38 */ 5.58/2.38 public static void main(String[] args) { 5.58/2.38 int value = args[1].length(); 5.58/2.38 if (args[0].length() % 2 == 0) { 5.58/2.38 value = -value; 5.58/2.38 } 5.58/2.38 Ex07.loop(value); 5.58/2.38 5.58/2.38 } 5.58/2.38 5.58/2.38 } 5.58/2.38 5.58/2.38 5.58/2.38 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (3) JBCToGraph (EQUIVALENT) 5.58/2.38 Constructed TerminationGraph. 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (4) 5.58/2.38 Obligation: 5.58/2.38 Termination Graph based on JBC Program: 5.58/2.38 simple.ex07.Main.main([Ljava/lang/String;)V: Graph of 120 nodes with 2 SCCs. 5.58/2.38 5.58/2.38 5.58/2.38 5.58/2.38 5.58/2.38 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (5) JBCNonTerm (COMPLETE) 5.58/2.38 Reached a loop using the following run: 5.58/2.38 5.58/2.38 0: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 1: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 2: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 3: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 4: 5.58/2.38 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 5: 5.58/2.38 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 6: 5.58/2.38 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 7: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 8: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 9: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 10: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 a2([java.lang.String...]): {o33, o15} -->{java.lang.Object...} 5.58/2.38 o15!: String(count=0, hash=#, offset=0, value=o16?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 o16:: [CHAR] -->{java.lang.Object...} 5.58/2.38 a2-><-o34 5.58/2.38 a2-><-o33 5.58/2.38 a2-><-o16 5.58/2.38 a2-><-o15 5.58/2.38 YES: (JL1) 5.58/2.38 11: 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 YES: (JL1) 5.58/2.38 12: 5.58/2.38 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 YES: (JL1) 5.58/2.38 13: 5.58/2.38 5.58/2.38 o33!: String(count=0, hash=#, offset=0, value=o34?) -->{java.lang.Object...} 5.58/2.38 o34:: [CHAR] -->{java.lang.Object...} 5.58/2.38 YES: (JL1) 5.58/2.38 14: 5.58/2.38 5.58/2.38 YES: (JL1) 5.58/2.38 15: 5.58/2.38 YES: (JL1) 5.58/2.38 16: 5.58/2.38 YES: (JL1) 5.58/2.38 17: 5.58/2.38 YES: (JL1) 5.58/2.38 18: 5.58/2.38 YES: (JL1) 5.58/2.38 19: 5.58/2.38 YES: (JL1) 5.58/2.38 20: 5.58/2.38 YES: (JL1) 5.58/2.38 21: 5.58/2.38 YES: (JL1) 5.58/2.38 22: 5.58/2.38 YES: (JL1) 5.58/2.38 23: 5.58/2.38 5.58/2.38 YES: (JL1) 5.58/2.38 Start state of loop: 5.58/2.38 5.58/2.38 5.58/2.38 [a2(lv_0_0)] 5.58/2.38 5.58/2.38 a2([java.lang.String...]): length i6 -->{java.lang.Object...} 5.58/2.38 i6: [2,+inf){0,+inf} 5.58/2.38 i14: [0,+inf) 5.58/2.38 YES: (JL1) 5.58/2.38 5.58/2.38 5.58/2.38 In the loop head node, references [i14] were interesting. 5.58/2.38 5.58/2.38 All methods calls in the loop body are side-effect free, hence they can be ignored. 5.58/2.38 5.58/2.38 By SMT, we could prove 5.58/2.38 5.58/2.38 ((0 <= initial_i14 and 2 <= initial_i6) and ((((0 = path1_i48 and path1_i48 = res_i14 and path1_i14 = initial_i14) and (path1_i14 = 0 and 0 <= 0 and path1_i48 >= 0)) or ((path2_i14 = path2_i43 and path2_i48 = (path2_i43 + -1) and path2_i48 = res_i14 and path2_i14 = initial_i14) and (path2_i43 > 0 and path2_i48 >= 0))) and (((0 = res1_i48 and res_i14 = res1_i14) and !(res1_i14 = 0 and 0 <= 0 and res1_i48 >= 0)) and ((res2_i14 = res2_i43 and res2_i48 = (res2_i43 + -1) and res_i14 = res2_i14) and !(res2_i43 > 0 and res2_i48 >= 0))))) 5.58/2.38 5.58/2.38 to be UNSAT. Consequently, the loop will not terminate. 5.58/2.38 ---------------------------------------- 5.58/2.38 5.58/2.38 (6) 5.58/2.38 NO 5.58/2.40 EOF