/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, 175 ms] (2) LLVM problem (3) LLVMToTerminationGraphProof [EQUIVALENT, 5236 ms] (4) LLVM Symbolic Execution Graph (5) SymbolicExecutionGraphToSCCProof [SOUND, 0 ms] (6) LLVM Symbolic Execution SCC (7) SCC2IRS [SOUND, 172 ms] (8) IntTRS (9) IRS2T2 [EQUIVALENT, 0 ms] (10) T2IntSys (11) T2 [EQUIVALENT, 1020 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: false visibilityType: DEFAULT callingConvention: ccc *BasicFunctionTypename: "__VERIFIER_error" returnParam: BasicVoidType parameters: () variableLength: true visibilityType: DEFAULT callingConvention: ccc *BasicFunctionTypename: "fibonacci" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: (n i32) variableLength: false visibilityType: DEFAULT callingConvention: ccc 0: %1 = alloca i32, align 4 %2 = alloca i32, align 4 store %n, %2 %3 = load %2 %4 = icmp slt %3 1 br %4, %5, %6 5: store 0, %1 br %18 6: %7 = load %2 %8 = icmp eq %7 1 br %8, %9, %10 9: store 1, %1 br %18 10: %11 = load %2 %12 = sub %11 1 %13 = call i32 @fibonacci(i32 %12) %14 = load %2 %15 = sub %14 2 %16 = call i32 @fibonacci(i32 %15) %17 = add %13 %16 store %17, %1 br %18 18: %19 = load %1 ret %19 *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 %result = alloca i32, align 4 store 0, %1 %2 = call i32 @__VERIFIER_nondet_int() store %2, %x %3 = load %x %4 = icmp slt %3 1 br %4, %5, %6 5: store 0, %1 br %14 6: %7 = load %x %8 = call i32 @fibonacci(i32 %7) store %8, %result %9 = load %result %10 = icmp sge %9 1 br %10, %11, %12 11: store 0, %1 br %14 12: br %13 13: Unnamed Call-Instruction = call BasicVoidType (...)* @__VERIFIER_error() noreturn unreachable 14: %15 = load %1 ret %15 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 48 rulesP rules: f_255(v97, v106, v98, v99, v100, v101, v102, v103, v107, 0, v105, 3, 1, 4) -> f_256(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) :|: 1 <= v108 && v109 = 3 + v108 && 4 <= v109 f_256(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) -> f_257(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) :|: TRUE f_257(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) -> f_258(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) :|: 0 = 0 f_258(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) -> f_260(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) :|: 1 <= v97 f_260(v97, v106, v108, v98, v99, v100, v101, v102, v103, v107, v109, 0, v105, 3, 1, 4) -> f_262(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 4) :|: 0 = 0 f_262(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 4) -> f_264(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 4) :|: TRUE f_264(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 4) -> f_266(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 4) :|: 0 = 0 f_266(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 4) -> f_269(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) :|: v97 != 1 && 2 <= v97 && 2 <= v105 f_269(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) -> f_272(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) :|: 0 = 0 f_272(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) -> f_275(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) :|: TRUE f_275(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) -> f_277(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) :|: 0 = 0 f_277(v97, v106, v108, 0, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 2, 1, 4) -> f_279(v97, v106, v108, 0, v122, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 1 + v122 = v97 && 1 <= v122 f_279(v97, v106, v108, 0, v122, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: 0 = 0 f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_283(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_287(1, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, 2, 3, 4) :|: TRUE f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_616(v122, v1212, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_643(v122, v1309, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_680(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_717(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_281(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_737(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_283(v122, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_254(v122, v98, v99, v100, v101, v102, v103, 0, v105, 3, 1, 4) :|: TRUE f_254(v97, v98, v99, v100, v101, v102, v103, 0, v105, 3, 1, 4) -> f_255(v97, v106, v98, v99, v100, v101, v102, v103, v107, 0, v105, 3, 1, 4) :|: 1 <= v106 && v107 = 3 + v106 && 4 <= v107 f_287(1, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, 2, 3, 4) -> f_289(2, v106, v108, 0, 1, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 4) :|: 0 = 0 f_289(2, v106, v108, 0, 1, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 4) -> f_291(2, v106, v108, 0, 1, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 4) :|: 0 = 0 f_291(2, v106, v108, 0, 1, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 4) -> f_293(2, v106, v108, 0, 1, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 4) :|: 0 = 0 f_293(2, v106, v108, 0, 1, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 4) -> f_295(0, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, v105, 2, 1, 3, 4) :|: 0 = 0 f_295(0, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, v105, 2, 1, 3, 4) -> f_297(0, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, v105, 2, 3, 1, 4) :|: TRUE f_297(0, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, v105, 2, 3, 1, 4) -> f_254(0, v98, v99, v100, v101, v102, v103, 0, v105, 3, 1, 4) :|: TRUE f_616(v122, v1212, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_623(v97, v106, v108, 0, v122, v1212, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 0 = 0 f_623(v97, v106, v108, 0, v122, v1212, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_626(v97, v106, v108, 0, v122, v1212, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 0 = 0 f_626(v97, v106, v108, 0, v122, v1212, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_629(v97, v106, v108, 0, v122, v1212, v1227, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 2 + v1227 = v97 && 0 <= v1227 f_629(v97, v106, v108, 0, v122, v1212, v1227, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_632(v1227, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, v122, v1212, 3, 1, 2, 4) :|: 0 = 0 f_632(v1227, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, v122, v1212, 3, 1, 2, 4) -> f_635(v1227, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 2, 1, 4) :|: TRUE f_635(v1227, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 2, 1, 4) -> f_254(v1227, v98, v99, v100, v101, v102, v103, 0, v105, 3, 1, 4) :|: TRUE f_643(v122, v1309, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_650(v97, v106, v108, 0, v122, v1309, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 0 = 0 f_650(v97, v106, v108, 0, v122, v1309, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_656(v97, v106, v108, 0, v122, v1309, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 0 = 0 f_656(v97, v106, v108, 0, v122, v1309, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_662(v97, v106, v108, 0, v122, v1309, v1329, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 2 + v1329 = v97 && 0 <= v1329 f_662(v97, v106, v108, 0, v122, v1309, v1329, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_668(v1329, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, v122, v1309, 3, 1, 2, 4) :|: 0 = 0 f_668(v1329, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, v122, v1309, 3, 1, 2, 4) -> f_674(v1329, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 2, 1, 4) :|: TRUE f_674(v1329, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 2, 1, 4) -> f_254(v1329, v98, v99, v100, v101, v102, v103, 0, v105, 3, 1, 4) :|: TRUE f_680(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_687(v97, v106, v108, 0, v122, v1439, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 0 = 0 f_687(v97, v106, v108, 0, v122, v1439, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_694(v97, v106, v108, 0, v122, v1439, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 0 = 0 f_694(v97, v106, v108, 0, v122, v1439, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_701(v97, v106, v108, 0, v122, v1439, v1499, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) :|: 2 + v1499 = v97 && 0 <= v1499 f_701(v97, v106, v108, 0, v122, v1439, v1499, v98, v99, v100, v101, v102, v103, v107, v109, v105, 3, 1, 2, 4) -> f_708(v1499, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, v122, v1439, 3, 1, 2, 4) :|: 0 = 0 f_708(v1499, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, v122, v1439, 3, 1, 2, 4) -> f_715(v1499, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 2, 1, 4) :|: TRUE f_715(v1499, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 2, 1, 4) -> f_254(v1499, v98, v99, v100, v101, v102, v103, 0, v105, 3, 1, 4) :|: TRUE f_717(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_680(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE f_737(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) -> f_717(v122, v1439, v98, v99, v100, v101, v102, v103, v106, v107, v108, v109, 0, v105, v97, 3, 1, 2, 4) :|: TRUE Combined rules. Obtained 3 rulesP rules: f_255(2 + v1499:0, v106:0, v98:0, v99:0, v100:0, v101:0, v102:0, v103:0, v107:0, 0, v105:0, 3, 1, 4) -> f_255(v1499:0, v106:1, v98:0, v99:0, v100:0, v101:0, v102:0, v103:0, 3 + v106:1, 0, v105:0, 3, 1, 4) :|: v1499:0 > -1 && v108:0 > 0 && v105:0 > 1 && v122:0 > 0 && 2 + v1499:0 = 1 + v122:0 && v106:1 > 0 f_255(1 + v122:0, v106:0, v98:0, v99:0, v100:0, v101:0, v102:0, v103:0, v107:0, 0, v105:0, 3, 1, 4) -> f_255(v122:0, v106:1, v98:0, v99:0, v100:0, v101:0, v102:0, v103:0, 3 + v106:1, 0, v105:0, 3, 1, 4) :|: v122:0 > 0 && v108:0 > 0 && v105:0 > 1 && v106:1 > 0 f_255(1 + v122:0, v106:0, v98:0, v99:0, v100:0, v101:0, v102:0, v103:0, v107:0, 0, v105:0, 3, 1, 4) -> f_255(0, v106:1, v98:0, v99:0, v100:0, v101:0, v102:0, v103:0, 3 + v106:1, 0, v105:0, 3, 1, 4) :|: v122:0 > 0 && v108:0 > 0 && v105:0 > 1 && v106:1 > 0 Filtered unneeded arguments: f_255(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14) -> f_255(x1, x11) Removed division, modulo operations, cleaned up constraints. Obtained 3 rules.P rules: f_255(sum~cons_2~v1499:0, v105:0) -> f_255(v1499:0, v105:0) :|: v1499:0 > -1 && v105:0 > 1 && sum~cons_2~v1499:0 = 2 + v1499:0 f_255(sum~cons_1~v122:0, v105:0) -> f_255(v122:0, v105:0) :|: v122:0 > 0 && v105:0 > 1 && sum~cons_1~v122:0 = 1 + v122:0 f_255(sum~cons_1~v122:0, v105:0) -> f_255(0, v105:0) :|: v122:0 > 0 && v105:0 > 1 && sum~cons_1~v122:0 = 1 + v122:0 ---------------------------------------- (8) Obligation: Rules: f_255(sum~cons_2~v1499:0, v105:0) -> f_255(v1499:0, v105:0) :|: v1499:0 > -1 && v105:0 > 1 && sum~cons_2~v1499:0 = 2 + v1499:0 f_255(x, x1) -> f_255(x2, x1) :|: x2 > 0 && x1 > 1 && x = 1 + x2 f_255(x3, x4) -> f_255(0, x4) :|: x5 > 0 && x4 > 1 && x3 = 1 + x5 ---------------------------------------- (9) IRS2T2 (EQUIVALENT) Transformed input IRS into an integer transition system.Used the following mapping from defined symbols to location IDs: (f_255_2,1) ---------------------------------------- (10) Obligation: START: 0; FROM: 0; TO: 1; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := oldX0 - 2; assume(oldX2 > -1 && oldX1 > 1 && oldX0 = 2 + oldX2); x0 := oldX0 - 2; x1 := oldX1; TO: 1; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := oldX0 - 1; assume(oldX2 > 0 && oldX1 > 1 && oldX0 = 1 + oldX2); x0 := oldX0 - 1; x1 := oldX1; TO: 1; FROM: 1; oldX0 := x0; oldX1 := x1; oldX2 := oldX0 - 1; assume(oldX2 > 0 && oldX1 > 1 && oldX0 = 1 + oldX2); x0 := 0; x1 := oldX1; TO: 1; ---------------------------------------- (11) T2 (EQUIVALENT) Initially, performed program simplifications using lexicographic rank functions: * Removed transitions 1, 4, 5, 6 using the following rank functions: - Rank function 1: RF for loc. 5: 1+2*x0 RF for loc. 6: 2*x0 Bound for (chained) transitions 4: 4 Bound for (chained) transitions 5: 4 Bound for (chained) transitions 6: 4 - Rank function 2: RF for loc. 5: 1 RF for loc. 6: 0 Bound for (chained) transitions 1: 1 ---------------------------------------- (12) YES