4.60/2.12 NO 4.60/2.16 proof of /export/starexec/sandbox/benchmark/theBenchmark.jar 4.60/2.16 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 4.60/2.16 4.60/2.16 4.60/2.16 termination of the given Bare JBC problem could be disproven: 4.60/2.16 4.60/2.16 (0) Bare JBC problem 4.60/2.16 (1) BareJBCToJBCProof [EQUIVALENT, 96 ms] 4.60/2.16 (2) JBC problem 4.60/2.16 (3) JBCNonTerm [COMPLETE, 203 ms] 4.60/2.16 (4) NO 4.60/2.16 4.60/2.16 4.60/2.16 ---------------------------------------- 4.60/2.16 4.60/2.16 (0) 4.60/2.16 Obligation: 4.60/2.16 need to prove termination of the following program: 4.60/2.16 package example_5; 4.60/2.16 4.60/2.16 public class Loops2 { 4.60/2.16 4.60/2.16 int i; 4.60/2.16 4.60/2.16 /** 4.60/2.16 * Same simple arithmetic loop, but now the loop counter 4.60/2.16 * is a numeric field. 4.60/2.16 */ 4.60/2.16 public void m(int n) { 4.60/2.16 while (i < n) { 4.60/2.16 i++; 4.60/2.16 } 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 4.60/2.16 package example_5; 4.60/2.16 4.60/2.16 public class Loops3 extends Loops2 { 4.60/2.16 4.60/2.16 /** 4.60/2.16 * A loop involving two numeric fields 4.60/2.16 * which are modified in the body of the loop 4.60/2.16 */ 4.60/2.16 public void m(int n, Loops3 x) { 4.60/2.16 while (i < n) { 4.60/2.16 i++; 4.60/2.16 x.i--; 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 4.60/2.16 package example_5; 4.60/2.16 4.60/2.16 public class Test { 4.60/2.16 /** 4.60/2.16 * Execution of the main method does not terminate because in the call to 4.60/2.16 * m, the objects o1 and o2 are aliased and therefore by decrementing x.i we are 4.60/2.16 * also decrementing this.i in the loop in method m. 4.60/2.16 */ 4.60/2.16 public static void main(String[] args) { 4.60/2.16 Loops3 o1 = new Loops3(); 4.60/2.16 Loops3 o2 = o1; 4.60/2.16 o1.m(10, o2); 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 4.60/2.16 4.60/2.16 ---------------------------------------- 4.60/2.16 4.60/2.16 (1) BareJBCToJBCProof (EQUIVALENT) 4.60/2.16 initialized classpath 4.60/2.16 ---------------------------------------- 4.60/2.16 4.60/2.16 (2) 4.60/2.16 Obligation: 4.60/2.16 need to prove termination of the following program: 4.60/2.16 package example_5; 4.60/2.16 4.60/2.16 public class Loops2 { 4.60/2.16 4.60/2.16 int i; 4.60/2.16 4.60/2.16 /** 4.60/2.16 * Same simple arithmetic loop, but now the loop counter 4.60/2.16 * is a numeric field. 4.60/2.16 */ 4.60/2.16 public void m(int n) { 4.60/2.16 while (i < n) { 4.60/2.16 i++; 4.60/2.16 } 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 4.60/2.16 package example_5; 4.60/2.16 4.60/2.16 public class Loops3 extends Loops2 { 4.60/2.16 4.60/2.16 /** 4.60/2.16 * A loop involving two numeric fields 4.60/2.16 * which are modified in the body of the loop 4.60/2.16 */ 4.60/2.16 public void m(int n, Loops3 x) { 4.60/2.16 while (i < n) { 4.60/2.16 i++; 4.60/2.16 x.i--; 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 4.60/2.16 package example_5; 4.60/2.16 4.60/2.16 public class Test { 4.60/2.16 /** 4.60/2.16 * Execution of the main method does not terminate because in the call to 4.60/2.16 * m, the objects o1 and o2 are aliased and therefore by decrementing x.i we are 4.60/2.16 * also decrementing this.i in the loop in method m. 4.60/2.16 */ 4.60/2.16 public static void main(String[] args) { 4.60/2.16 Loops3 o1 = new Loops3(); 4.60/2.16 Loops3 o2 = o1; 4.60/2.16 o1.m(10, o2); 4.60/2.16 } 4.60/2.16 4.60/2.16 } 4.60/2.16 4.60/2.16 4.60/2.16 4.60/2.16 ---------------------------------------- 4.60/2.16 4.60/2.16 (3) JBCNonTerm (COMPLETE) 4.60/2.16 Constructed a run with a repetition. States 16 and 33 are repetitions (when considering only the interesting positions []). 4.60/2.16 4.60/2.16 0: 4.60/2.16 YES: (JL1) 4.60/2.16 1: 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 2:()V|| - ||o40, o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 3:||0: load ADDR #0||#0: o40|| -> 4.60/2.16 || - ||o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 4:||1: example_5.Loops2.()V|| - ||o40> 4.60/2.16 || - ||o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 5:||0: load ADDR #0||#0: o40|| -> 4.60/2.16 ||1: example_5.Loops2.|| - || -> 4.60/2.16 || - ||o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 6:||1: java.lang.Object.()V|| - ||o40> 4.60/2.16 ||1: example_5.Loops2.|| - || -> 4.60/2.16 || - ||o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 7:||4: return|| - || -> 4.60/2.16 ||1: example_5.Loops2.|| - || -> 4.60/2.16 || - ||o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.16 8:||4: return|| - || -> 4.60/2.16 || - ||o40> 4.60/2.16 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.16 YES: (JL1) 4.60/2.17 9: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 10: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 11: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 12: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 13: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 14: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 15: 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 16: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 17: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 18: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 19: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 20: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 21: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 22: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 23: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 24: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 25: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 26: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=1) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 27: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=1) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 28: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=1) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 29: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=1) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 30: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=1) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 31: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=1) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 32: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 33: 4.60/2.17 4.60/2.17 o40!: Loops2(Loops3(), i=0) -->{java.lang.Object|} 4.60/2.17 YES: (JL1) 4.60/2.17 4.60/2.17 ---------------------------------------- 4.60/2.17 4.60/2.17 (4) 4.60/2.17 NO 4.78/2.19 EOF