/export/starexec/sandbox/solver/bin/starexec_run_c /export/starexec/sandbox/benchmark/theBenchmark.c /export/starexec/sandbox/output/output_files -------------------------------------------------------------------------------- YES proof of /export/starexec/sandbox/benchmark/theBenchmark.c # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty Termination of the given C Problem could be proven: (0) C Problem (1) CToLLVMProof [EQUIVALENT, 180 ms] (2) LLVM problem (3) LLVMToTerminationGraphProof [EQUIVALENT, 700 ms] (4) LLVM Symbolic Execution Graph (5) SymbolicExecutionGraphToSCCProof [SOUND, 0 ms] (6) LLVM Symbolic Execution SCC (7) SCC2IRS [SOUND, 105 ms] (8) IntTRS (9) IRS2T2 [EQUIVALENT, 0 ms] (10) T2IntSys (11) T2 [EQUIVALENT, 743 ms] (12) YES ---------------------------------------- (0) Obligation: c file /export/starexec/sandbox/benchmark/theBenchmark.c ---------------------------------------- (1) CToLLVMProof (EQUIVALENT) Compiled c-file /export/starexec/sandbox/benchmark/theBenchmark.c to LLVM. ---------------------------------------- (2) Obligation: LLVM Problem Aliases: Data layout: "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" Machine: "x86_64-pc-linux-gnu" Type definitions: Global variables: Name: x initVal: 0 type: i32 addrSpace: null alignment: 4 threadLocal: false constant: false linkageType: COMMON section: null Function declarations and definitions: *BasicFunctionTypename: "__VERIFIER_nondet_int" returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc *BasicFunctionTypename: "foo" linkageType: EXTERNALLY_VISIBLE returnParam: BasicVoidType parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = load @x %2 = add %1 -1 store %2, @x ret void *BasicFunctionTypename: "main" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 store 0, %1 %2 = call i32 @__VERIFIER_nondet_int() store %2, @x br %3 3: %4 = load @x %5 = icmp sgt %4 0 br %5, %6, %12 6: %7 = call i32 @__VERIFIER_nondet_int() %8 = icmp ne %7 0 br %8, %9, %10 9: Unnamed Call-Instruction = call BasicVoidType @foo() br %11 10: Unnamed Call-Instruction = call BasicVoidType @foo() br %11 11: br %3 12: ret 0 Analyze Termination of all function calls matching the pattern: main() ---------------------------------------- (3) LLVMToTerminationGraphProof (EQUIVALENT) Constructed symbolic execution graph for LLVM program and proved memory safety. ---------------------------------------- (4) Obligation: SE Graph ---------------------------------------- (5) SymbolicExecutionGraphToSCCProof (SOUND) Splitted symbolic execution graph to 1 SCC. ---------------------------------------- (6) Obligation: SCC ---------------------------------------- (7) SCC2IRS (SOUND) Transformed LLVM symbolic execution graph SCC into a rewrite problem. Log: Generated rules. Obtained 40 rulesP rules: f_177(v106, v109, v112, v107, v113, 0, v108, 1, 3, 4) -> f_179(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) :|: 1 + v116 = v109 && 0 <= v116 f_179(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) -> f_181(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) :|: TRUE f_181(v106, v109, v116, v112, v107, v113, 0, v108, 1, 3, 4) -> f_183(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) :|: TRUE f_183(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) -> f_185(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) :|: TRUE f_185(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) -> f_188(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) :|: TRUE f_188(v106, v107, v108, v109, 1, 0, v112, v113, v116, 3, 4) -> f_190(v106, v107, v108, v116, 1, 0, v112, v113, 3, 4) :|: 0 = 0 f_190(v106, v107, v108, v116, 1, 0, v112, v113, 3, 4) -> f_193(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: 0 < v116 && 2 <= v108 f_193(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_197(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: 0 = 0 f_197(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_201(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: TRUE f_201(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_204(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) :|: TRUE f_204(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) -> f_207(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) :|: v146 != 0 f_204(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) -> f_208(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: v146 = 0 f_207(v106, v107, v108, v116, 1, v146, 0, v112, v113, 3, 2, 4) -> f_211(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) :|: 0 = 0 f_211(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) -> f_215(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) :|: TRUE f_215(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) -> f_213(v106, v107, v108, v116, 1, v146, v112, v113, 0, 3, 2, 4) :|: TRUE f_213(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_217(v121, v127, v122, v128, v129, 0, v123, 1, v145, 3, 2, 4) :|: TRUE f_217(v121, v127, v122, v128, v129, 0, v123, 1, v145, 3, 2, 4) -> f_219(v121, v129, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) :|: 0 = 0 f_219(v121, v129, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) -> f_220(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) :|: 1 + v174 = v129 && 0 <= v174 f_220(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) -> f_221(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) :|: TRUE f_221(v121, v129, v174, v127, v122, v128, 0, v123, 1, v145, 3, 2, 4) -> f_222(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) :|: TRUE f_222(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) -> f_223(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) :|: TRUE f_223(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) -> f_224(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) :|: TRUE f_224(v121, v122, v123, v129, 1, v145, v127, v128, 0, v174, 3, 2, 4) -> f_187(v121, v122, v123, v129, 1, v145, v127, v128, v174, 0, 3, 4) :|: TRUE f_187(v121, v122, v123, v124, 1, v126, v127, v128, v129, 0, 3, 4) -> f_189(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 4) :|: 0 = 0 f_189(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 4) -> f_191(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) :|: 0 < v129 && 2 <= v123 f_191(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) -> f_195(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) :|: 0 = 0 f_195(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) -> f_199(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) :|: TRUE f_199(v121, v122, v123, v129, 1, v126, v127, v128, 0, 3, 2, 4) -> f_203(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: TRUE f_203(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_205(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: v145 != 0 f_203(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_206(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) :|: v145 = 0 f_205(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_209(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: 0 = 0 f_209(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) -> f_213(v121, v122, v123, v129, 1, v145, v127, v128, 0, 3, 2, 4) :|: TRUE f_206(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) -> f_210(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) :|: 0 = 0 f_210(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) -> f_214(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) :|: TRUE f_214(v121, v122, v123, v129, 1, 0, v127, v128, 3, 2, 4) -> f_218(v121, v127, v122, v128, v129, 0, v123, 1, 3, 2, 4) :|: TRUE f_218(v121, v127, v122, v128, v129, 0, v123, 1, 3, 2, 4) -> f_175(v121, v127, v122, v128, v129, 0, v108, 1, 3, 4) :|: TRUE f_175(v106, v112, v107, v113, v109, 0, v108, 1, 3, 4) -> f_177(v106, v109, v112, v107, v113, 0, v108, 1, 3, 4) :|: 0 = 0 f_208(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_212(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: 0 = 0 f_212(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_216(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: TRUE f_216(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) -> f_214(v106, v107, v108, v116, 1, 0, v112, v113, 3, 2, 4) :|: TRUE Combined rules. Obtained 6 rulesP rules: f_203(v121:0, v122:0, v123:0, 1 + v174:0, 1, v145:0, v127:0, v128:0, 0, 3, 2, 4) -> f_203(v121:0, v122:0, v123:0, v174:0, 1, v145:1, v127:0, v128:0, 0, 3, 2, 4) :|: v174:0 > 0 && v145:0 < 0 && v123:0 > 1 f_203(v121:0, v122:0, v123:0, 1 + v174:0, 1, v145:0, v127:0, v128:0, 0, 3, 2, 4) -> f_203(v121:0, v122:0, v123:0, v174:0, 1, v145:1, v127:0, v128:0, 0, 3, 2, 4) :|: v174:0 > 0 && v145:0 > 0 && v123:0 > 1 f_177(v106:0, 1 + v116:0, v112:0, v107:0, v113:0, 0, v108:0, 1, 3, 4) -> f_177(v106:0, v116:0, v112:0, v107:0, v113:0, 0, v108:1, 1, 3, 4) :|: v108:0 > 1 && v116:0 > 0 f_177(v106:0, 1 + (1 + v174:0), v112:0, v107:0, v113:0, 0, v108:0, 1, 3, 4) -> f_203(v106:0, v107:0, v108:0, v174:0, 1, v145:0, v112:0, v113:0, 0, 3, 2, 4) :|: v174:0 > 0 && v108:0 > 1 && v146:0 < 0 f_177(v106:0, 1 + (1 + v174:0), v112:0, v107:0, v113:0, 0, v108:0, 1, 3, 4) -> f_203(v106:0, v107:0, v108:0, v174:0, 1, v145:0, v112:0, v113:0, 0, 3, 2, 4) :|: v174:0 > 0 && v108:0 > 1 && v146:0 > 0 f_203(v121:0, v122:0, v123:0, v129:0, 1, 0, v127:0, v128:0, 0, 3, 2, 4) -> f_177(v121:0, v129:0, v127:0, v122:0, v128:0, 0, v108:0, 1, 3, 4) :|: TRUE Filtered unneeded arguments: f_203(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) -> f_203(x3, x4, x6) f_177(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) -> f_177(x2, x7) Removed division, modulo operations, cleaned up constraints. Obtained 5 rules.P rules: f_203(v123:0, sum~cons_1~v174:0, v145:0) -> f_203(v123:0, v174:0, v145:1) :|: v145:0 < 0 && v123:0 > 1 && v174:0 > 0 && sum~cons_1~v174:0 = 1 + v174:0 f_203(v123:0, sum~cons_1~v174:0, v145:0) -> f_203(v123:0, v174:0, v145:1) :|: v145:0 > 0 && v123:0 > 1 && v174:0 > 0 && sum~cons_1~v174:0 = 1 + v174:0 f_177(sum~cons_1~v116:0, v108:0) -> f_177(v116:0, v108:1) :|: v108:0 > 1 && v116:0 > 0 && sum~cons_1~v116:0 = 1 + v116:0 f_177(sum~cons_1~sum~cons_1~v174:0, v108:0) -> f_203(v108:0, v174:0, v145:0) :|: v174:0 > 0 && v108:0 > 1 && sum~cons_1~sum~cons_1~v174:0 = 1 + (1 + v174:0) f_203(v123:0, v129:0, cons_0) -> f_177(v129:0, v108:0) :|: TRUE && cons_0 = 0 ---------------------------------------- (8) Obligation: Rules: f_203(v123:0, sum~cons_1~v174:0, v145:0) -> f_203(v123:0, v174:0, v145:1) :|: v145:0 < 0 && v123:0 > 1 && v174:0 > 0 && sum~cons_1~v174:0 = 1 + v174:0 f_203(x, x1, x2) -> f_203(x, x3, x4) :|: x2 > 0 && x > 1 && x3 > 0 && x1 = 1 + x3 f_177(sum~cons_1~v116:0, v108:0) -> f_177(v116:0, v108:1) :|: v108:0 > 1 && v116:0 > 0 && sum~cons_1~v116:0 = 1 + v116:0 f_177(x5, x6) -> f_203(x6, x7, x8) :|: x7 > 0 && x6 > 1 && x5 = 1 + (1 + x7) f_203(x9, x10, x11) -> f_177(x10, x12) :|: TRUE && x11 = 0 ---------------------------------------- (9) IRS2T2 (EQUIVALENT) Transformed input IRS into an integer transition system.Used the following mapping from defined symbols to location IDs: (f_203_3,1) (f_177_3,2) ---------------------------------------- (10) Obligation: START: 0; FROM: 0; TO: 1; FROM: 0; TO: 2; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := oldX1 - 1; oldX4 := nondet(); assume(oldX2 < 0 && oldX0 > 1 && oldX3 > 0 && oldX1 = 1 + oldX3); x0 := oldX0; x1 := oldX1 - 1; x2 := oldX4; TO: 1; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := oldX1 - 1; oldX4 := nondet(); assume(oldX2 > 0 && oldX0 > 1 && oldX3 > 0 && oldX1 = 1 + oldX3); x0 := oldX0; x1 := oldX1 - 1; x2 := oldX4; TO: 1; FROM: 2; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := oldX0 - 1; oldX4 := nondet(); oldX5 := nondet(); assume(oldX1 > 1 && oldX3 > 0 && oldX0 = 1 + oldX3); x0 := oldX0 - 1; x1 := oldX4; x2 := oldX5; TO: 2; FROM: 2; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := oldX0 - 2; oldX4 := nondet(); assume(oldX3 > 0 && oldX1 > 1 && oldX0 = 1 + (1 + oldX3)); x0 := oldX1; x1 := oldX0 - 2; x2 := oldX4; TO: 1; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := nondet(); oldX4 := nondet(); assume(0 = 0 && oldX2 = 0); x0 := oldX1; x1 := oldX3; x2 := oldX4; TO: 2; ---------------------------------------- (11) T2 (EQUIVALENT) Initially, performed program simplifications using lexicographic rank functions: * Removed transitions 2, 5, 6, 7, 17, 20, 21 using the following rank functions: - Rank function 1: RF for loc. 6: 2*x1 RF for loc. 7: -2+2*x0 RF for loc. 8: -1+2*x1 RF for loc. 12: -3+2*x0 Bound for (chained) transitions 5: 3 Bound for (chained) transitions 6: 3 Bound for (chained) transitions 20: 1 Bound for (chained) transitions 21: 3 - Rank function 2: RF for loc. 6: 1 RF for loc. 7: -1 RF for loc. 8: 0 RF for loc. 12: -2 Bound for (chained) transitions 2: 1 Bound for (chained) transitions 7: 0 Bound for (chained) transitions 17: -1 ---------------------------------------- (12) YES