/export/starexec/sandbox2/solver/bin/starexec_run_c /export/starexec/sandbox2/benchmark/theBenchmark.c /export/starexec/sandbox2/output/output_files -------------------------------------------------------------------------------- YES proof of /export/starexec/sandbox2/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, 178 ms] (2) LLVM problem (3) LLVMToTerminationGraphProof [EQUIVALENT, 1600 ms] (4) LLVM Symbolic Execution Graph (5) SymbolicExecutionGraphToLassoProof [EQUIVALENT, 0 ms] (6) LLVM Symbolic Execution Lasso (7) Lasso2IRS [EQUIVALENT, 84 ms] (8) IntTRS (9) IRS2T2 [EQUIVALENT, 0 ms] (10) T2IntSys (11) T2 [EQUIVALENT, 1223 ms] (12) YES ---------------------------------------- (0) Obligation: c file /export/starexec/sandbox2/benchmark/theBenchmark.c ---------------------------------------- (1) CToLLVMProof (EQUIVALENT) Compiled c-file /export/starexec/sandbox2/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: Function declarations and definitions: *BasicFunctionTypename: "__VERIFIER_nondet_int" returnParam: i32 parameters: () variableLength: true visibilityType: DEFAULT callingConvention: ccc *BasicFunctionTypename: "main" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 %x = alloca i32, align 4 %y = alloca i32, align 4 %z = alloca i32, align 4 store 0, %1 %2 = call i32 (...)* @__VERIFIER_nondet_int() store %2, %x %3 = call i32 (...)* @__VERIFIER_nondet_int() store %3, %y %4 = call i32 (...)* @__VERIFIER_nondet_int() store %4, %z br %5 5: %6 = load %x %7 = load %y %8 = sub %6 %7 %9 = icmp sgt %8 0 br %9, %10, %18 10: %11 = load %x %12 = sub 0 %11 %13 = load %y %14 = add %12 %13 store %14, %x %15 = load %z store %15, %y %16 = load %z %17 = add %16 1 store %17, %z br %5 18: 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) SymbolicExecutionGraphToLassoProof (EQUIVALENT) Converted SEGraph to 1 independent lasso. ---------------------------------------- (6) Obligation: Lasso ---------------------------------------- (7) Lasso2IRS (EQUIVALENT) Transformed LLVM symbolic execution graph SCC into a rewrite problem. Log: Generated rules. Obtained 49 rulesP rules: f_165(v56, v57, v58, v59, v60, v61, v62, v68, v64, v65, 1, v63, v67, v69, v70, v71, v72, v73, v74, 0, 3, 4) -> f_166(v56, v57, v58, v59, v60, v61, v62, v68, v69, v65, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_166(v56, v57, v58, v59, v60, v61, v62, v68, v69, v65, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_167(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: v76 + v69 = v68 f_167(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_168(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 < v76 f_168(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_170(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_170(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_172(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: TRUE f_172(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v63, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_174(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_174(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v67, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_175(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v64, v70, v71, v72, v73, v74, 0, 3, 4) :|: v77 + v68 = 0 f_175(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v64, v70, v71, v72, v73, v74, 0, 3, 4) -> f_176(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_176(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v70, v71, v72, v73, v74, 0, 3, 4) -> f_177(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) :|: v78 = v77 + v69 f_177(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) -> f_178(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) :|: TRUE f_178(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) -> f_179(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_179(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) -> f_180(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) :|: TRUE f_180(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) -> f_181(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_181(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v71, v72, v73, v74, 0, 3, 4) -> f_182(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) :|: v81 = 1 + v70 f_182(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) -> f_183(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) :|: TRUE f_183(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) -> f_184(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) :|: TRUE f_184(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) -> f_164(v56, v57, v58, v59, v60, v61, v62, v68, v69, v76, 1, v77, v78, v70, v81, v71, v72, v73, v74, 0, 3, 4) :|: TRUE f_164(v56, v57, v58, v59, v60, v61, v62, v63, v64, v65, 1, v67, v68, v69, v70, v71, v72, v73, v74, 0, 3, 4) -> f_165(v56, v57, v58, v59, v60, v61, v62, v68, v64, v65, 1, v63, v67, v69, v70, v71, v72, v73, v74, 0, 3, 4) :|: 0 = 0 f_90 -> f_91(v1, v2, 3, 1, 4) :|: 1 <= v1 && v2 = 3 + v1 && 4 <= v2 f_91(v1, v2, 3, 1, 4) -> f_92(v1, v3, v2, v4, 3, 1, 4) :|: 1 <= v3 && v4 = 3 + v3 && 4 <= v4 f_92(v1, v3, v2, v4, 3, 1, 4) -> f_93(v1, v3, v5, v2, v4, v6, 3, 1, 4) :|: 1 <= v5 && v6 = 3 + v5 && 4 <= v6 f_93(v1, v3, v5, v2, v4, v6, 3, 1, 4) -> f_94(v1, v3, v5, v7, v2, v4, v6, v8, 3, 1, 4) :|: 1 <= v7 && v8 = 3 + v7 && 4 <= v8 f_94(v1, v3, v5, v7, v2, v4, v6, v8, 3, 1, 4) -> f_95(v1, v3, v5, v7, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_95(v1, v3, v5, v7, v2, v4, v6, v8, 0, 3, 1, 4) -> f_96(v1, v3, v5, v7, v9, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_96(v1, v3, v5, v7, v9, v2, v4, v6, v8, 0, 3, 1, 4) -> f_97(v1, v3, v5, v7, v9, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_97(v1, v3, v5, v7, v9, v2, v4, v6, v8, 0, 3, 1, 4) -> f_98(v1, v3, v5, v7, v9, v11, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_98(v1, v3, v5, v7, v9, v11, v2, v4, v6, v8, 0, 3, 1, 4) -> f_99(v1, v3, v5, v7, v9, v11, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_99(v1, v3, v5, v7, v9, v11, v2, v4, v6, v8, 0, 3, 1, 4) -> f_100(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_100(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) -> f_101(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_101(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) -> f_102(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) :|: TRUE f_102(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) -> f_103(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) :|: 0 = 0 f_103(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) -> f_104(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) :|: 0 = 0 f_104(v1, v3, v5, v7, v9, v11, v13, v2, v4, v6, v8, 0, 3, 1, 4) -> f_105(v1, v3, v5, v7, v9, v11, v13, v15, v2, v4, v6, v8, 0, 3, 1, 4) :|: v15 + v11 = v9 f_105(v1, v3, v5, v7, v9, v11, v13, v15, v2, v4, v6, v8, 0, 3, 1, 4) -> f_106(v1, v3, v5, v7, v9, v11, v13, v15, v2, v4, v6, v8, 0, 3, 1, 4) :|: 0 < v15 f_106(v1, v3, v5, v7, v9, v11, v13, v15, v2, v4, v6, v8, 0, 3, 1, 4) -> f_108(v1, v3, v5, v7, v9, v11, v13, v15, 1, v2, v4, v6, v8, 0, 3, 4) :|: 0 = 0 f_108(v1, v3, v5, v7, v9, v11, v13, v15, 1, v2, v4, v6, v8, 0, 3, 4) -> f_110(v1, v3, v5, v7, v9, v11, v13, v15, 1, v2, v4, v6, v8, 0, 3, 4) :|: TRUE f_110(v1, v3, v5, v7, v9, v11, v13, v15, 1, v2, v4, v6, v8, 0, 3, 4) -> f_112(v1, v3, v5, v7, v9, v11, v13, v15, 1, v2, v4, v6, v8, 0, 3, 4) :|: 0 = 0 f_112(v1, v3, v5, v7, v9, v11, v13, v15, 1, v2, v4, v6, v8, 0, 3, 4) -> f_113(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v2, v4, v6, v8, 0, 3, 4) :|: v16 + v9 = 0 f_113(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v2, v4, v6, v8, 0, 3, 4) -> f_114(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v2, v4, v6, v8, 0, 3, 4) :|: 0 = 0 f_114(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v2, v4, v6, v8, 0, 3, 4) -> f_115(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) :|: v17 = v16 + v11 f_115(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) -> f_116(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) :|: TRUE f_116(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) -> f_117(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) :|: 0 = 0 f_117(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) -> f_118(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) :|: TRUE f_118(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) -> f_119(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) :|: 0 = 0 f_119(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v2, v4, v6, v8, 0, 3, 4) -> f_120(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v20, v2, v4, v6, v8, 0, 3, 4) :|: v20 = 1 + v13 f_120(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v20, v2, v4, v6, v8, 0, 3, 4) -> f_121(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v20, v2, v4, v6, v8, 0, 3, 4) :|: TRUE f_121(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v20, v2, v4, v6, v8, 0, 3, 4) -> f_122(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v20, v2, v4, v6, v8, 0, 3, 4) :|: TRUE f_122(v1, v3, v5, v7, v9, v11, v13, v15, 1, v16, v17, v20, v2, v4, v6, v8, 0, 3, 4) -> f_143(v1, v3, v5, v7, v9, v11, v13, v9, v11, v15, 1, v16, v17, v13, v20, v2, v4, v6, v8, 0, 3, 4) :|: TRUE f_143(v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, 1, v40, v41, v42, v43, v44, v45, v46, v47, 0, 3, 4) -> f_164(v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, 1, v40, v41, v42, v43, v44, v45, v46, v47, 0, 3, 4) :|: TRUE Combined rules. Obtained 2 rulesP rules: f_90 -> f_165(v1:0, v3:0, v5:0, v7:0, v15:0 + v11:0, v11:0, v13:0, v16:0 + v11:0, v11:0, v15:0, 1, v15:0 + v11:0, v16:0, v13:0, 1 + v13:0, 3 + v1:0, 3 + v3:0, 3 + v5:0, 3 + v7:0, 0, 3, 4) :|: v3:0 > 0 && v1:0 > 0 && v5:0 > 0 && v7:0 > 0 && v16:0 + (v15:0 + v11:0) = 0 && v15:0 > 0 f_165(v56:0, v57:0, v58:0, v59:0, v60:0, v61:0, v62:0, v76:0 + v69:0, v64:0, v65:0, 1, v63:0, v67:0, v69:0, v70:0, v71:0, v72:0, v73:0, v74:0, 0, 3, 4) -> f_165(v56:0, v57:0, v58:0, v59:0, v60:0, v61:0, v62:0, v77:0 + v69:0, v69:0, v76:0, 1, v76:0 + v69:0, v77:0, v70:0, 1 + v70:0, v71:0, v72:0, v73:0, v74:0, 0, 3, 4) :|: v77:0 + (v76:0 + v69:0) = 0 && v76:0 > 0 Filtered unneeded arguments: f_165(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22) -> f_165(x5, x6, x8, x9, x10, x12, x13, x14, x15) Removed division, modulo operations, cleaned up constraints. Obtained 2 rules.P rules: f_90 -> f_165(v15:0 + v11:0, v11:0, v16:0 + v11:0, v11:0, v15:0, v15:0 + v11:0, v16:0, v13:0, 1 + v13:0) :|: v16:0 + (v15:0 + v11:0) = 0 && v15:0 > 0 f_165(v60:0, v61:0, sum~v76:0~v69:0, v64:0, v65:0, v63:0, v67:0, v69:0, v70:0) -> f_165(v60:0, v61:0, v77:0 + v69:0, v69:0, v76:0, v76:0 + v69:0, v77:0, v70:0, 1 + v70:0) :|: v77:0 + (v76:0 + v69:0) = 0 && v76:0 > 0 && sum~v76:0~v69:0 = v76:0 + v69:0 ---------------------------------------- (8) Obligation: Rules: f_90 -> f_165(v15:0 + v11:0, v11:0, v16:0 + v11:0, v11:0, v15:0, v15:0 + v11:0, v16:0, v13:0, 1 + v13:0) :|: v16:0 + (v15:0 + v11:0) = 0 && v15:0 > 0 f_165(v60:0, v61:0, sum~v76:0~v69:0, v64:0, v65:0, v63:0, v67:0, v69:0, v70:0) -> f_165(v60:0, v61:0, v77:0 + v69:0, v69:0, v76:0, v76:0 + v69:0, v77:0, v70:0, 1 + v70:0) :|: v77:0 + (v76:0 + v69:0) = 0 && v76:0 > 0 && sum~v76:0~v69:0 = v76:0 + v69:0 Start term: f_90 ---------------------------------------- (9) IRS2T2 (EQUIVALENT) Transformed input IRS into an integer transition system.Used the following mapping from defined symbols to location IDs: (f_90_9,1) (f_165_9,2) ---------------------------------------- (10) Obligation: START: 1; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := x3; oldX4 := x4; oldX5 := x5; oldX6 := x6; oldX7 := x7; oldX8 := x8; oldX9 := nondet(); oldX10 := nondet(); oldX11 := nondet(); oldX12 := nondet(); assume(oldX11 + (oldX9 + oldX10) = 0 && oldX9 > 0); x0 := oldX9 + oldX10; x1 := oldX10; x2 := oldX11 + oldX10; x3 := oldX10; x4 := oldX9; x5 := oldX9 + oldX10; x6 := oldX11; x7 := oldX12; x8 := 1 + oldX12; TO: 2; FROM: 2; oldX0 := x0; oldX1 := x1; oldX2 := x2; oldX3 := x3; oldX4 := x4; oldX5 := x5; oldX6 := x6; oldX7 := x7; oldX8 := x8; oldX10 := oldX2 - oldX7; oldX9 := -(oldX10 + oldX7 - 0); assume(oldX9 + (oldX10 + oldX7) = 0 && oldX10 > 0 && oldX2 = oldX10 + oldX7); x0 := oldX0; x1 := oldX1; x2 := oldX9 + oldX7; x3 := oldX7; x4 := oldX2 - oldX7; x5 := oldX10 + oldX7; x6 := -(oldX10 + oldX7 - 0); x7 := oldX8; x8 := 1 + oldX8; TO: 2; ---------------------------------------- (11) T2 (EQUIVALENT) No proof given by T2 ---------------------------------------- (12) YES