126.10/94.57 YES 126.10/94.59 proof of /export/starexec/sandbox/benchmark/theBenchmark.c 126.10/94.59 # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty 126.10/94.59 126.10/94.59 126.10/94.59 Termination of the given C Problem could be proven: 126.10/94.59 126.10/94.59 (0) C Problem 126.10/94.59 (1) CToLLVMProof [EQUIVALENT, 175 ms] 126.10/94.59 (2) LLVM problem 126.10/94.59 (3) LLVMToTerminationGraphProof [EQUIVALENT, 91.4 s] 126.10/94.59 (4) LLVM Symbolic Execution Graph 126.10/94.59 (5) SymbolicExecutionGraphToSCCProof [SOUND, 0 ms] 126.10/94.59 (6) LLVM Symbolic Execution SCC 126.10/94.59 (7) SCC2IRS [SOUND, 104 ms] 126.10/94.59 (8) IntTRS 126.10/94.59 (9) IntTRSCompressionProof [EQUIVALENT, 0 ms] 126.10/94.59 (10) IntTRS 126.10/94.59 (11) RankingReductionPairProof [EQUIVALENT, 24 ms] 126.10/94.59 (12) YES 126.10/94.59 126.10/94.59 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (0) 126.10/94.59 Obligation: 126.10/94.59 c file /export/starexec/sandbox/benchmark/theBenchmark.c 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (1) CToLLVMProof (EQUIVALENT) 126.10/94.59 Compiled c-file /export/starexec/sandbox/benchmark/theBenchmark.c to LLVM. 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (2) 126.10/94.59 Obligation: 126.10/94.59 LLVM Problem 126.10/94.59 126.10/94.59 Aliases: 126.10/94.59 126.10/94.59 Data layout: 126.10/94.59 126.10/94.59 "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" 126.10/94.59 126.10/94.59 Machine: 126.10/94.59 126.10/94.59 "x86_64-pc-linux-gnu" 126.10/94.59 126.10/94.59 Type definitions: 126.10/94.59 126.10/94.59 Global variables: 126.10/94.59 126.10/94.59 Function declarations and definitions: 126.10/94.59 126.10/94.59 *BasicFunctionTypename: "__VERIFIER_nondet_int" returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 126.10/94.59 *BasicFunctionTypename: "cstrcpy" linkageType: EXTERNALLY_VISIBLE returnParam: *i8 parameters: (to *i8, from *i8) variableLength: false visibilityType: DEFAULT callingConvention: ccc 126.10/94.59 0: 126.10/94.59 %1 = alloca *i8, align 8 126.10/94.59 %2 = alloca *i8, align 8 126.10/94.59 %save = alloca *i8, align 8 126.10/94.59 store %to, %1 126.10/94.59 store %from, %2 126.10/94.59 %3 = load %1 126.10/94.59 store %3, %save 126.10/94.59 br %4 126.10/94.59 4: 126.10/94.59 %5 = load %2 126.10/94.59 %6 = load %5 126.10/94.59 %7 = load %1 126.10/94.59 store %6, %7 126.10/94.59 %8 = sext i8 %6 to i32 126.10/94.59 %9 = icmp ne %8 0 126.10/94.59 br %9, %10, %16 126.10/94.59 10: 126.10/94.59 br %11 126.10/94.59 11: 126.10/94.59 %12 = load %2 126.10/94.59 %13 = getelementptr %12, 1 126.10/94.59 store %13, %2 126.10/94.59 %14 = load %1 126.10/94.59 %15 = getelementptr %14, 1 126.10/94.59 store %15, %1 126.10/94.59 br %4 126.10/94.59 16: 126.10/94.59 %17 = load %save 126.10/94.59 ret %17 126.10/94.59 126.10/94.59 *BasicFunctionTypename: "main" linkageType: EXTERNALLY_VISIBLE returnParam: i32 parameters: () variableLength: false visibilityType: DEFAULT callingConvention: ccc 126.10/94.59 0: 126.10/94.59 %1 = alloca i32, align 4 126.10/94.59 %length1 = alloca i32, align 4 126.10/94.59 %length2 = alloca i32, align 4 126.10/94.59 %nondetArea = alloca *i8, align 8 126.10/94.59 %nondetString = alloca *i8, align 8 126.10/94.59 store 0, %1 126.10/94.59 %2 = call i32 @__VERIFIER_nondet_int() 126.10/94.59 store %2, %length1 126.10/94.59 %3 = call i32 @__VERIFIER_nondet_int() 126.10/94.59 store %3, %length2 126.10/94.59 %4 = load %length1 126.10/94.59 %5 = icmp slt %4 1 126.10/94.59 br %5, %6, %7 126.10/94.59 6: 126.10/94.59 store 1, %length1 126.10/94.59 br %7 126.10/94.59 7: 126.10/94.59 %8 = load %length2 126.10/94.59 %9 = icmp slt %8 1 126.10/94.59 br %9, %10, %11 126.10/94.59 10: 126.10/94.59 store 1, %length2 126.10/94.59 br %11 126.10/94.59 11: 126.10/94.59 %12 = load %length1 126.10/94.59 %13 = load %length2 126.10/94.59 %14 = icmp slt %12 %13 126.10/94.59 br %14, %15, %16 126.10/94.59 15: 126.10/94.59 store 0, %1 126.10/94.59 br %33 126.10/94.59 16: 126.10/94.59 %17 = load %length1 126.10/94.59 %18 = sext i32 %17 to i64 126.10/94.59 %19 = mul %18 1 126.10/94.59 %20 = alloca i8, numElementsLit: %19 126.10/94.59 store %20, %nondetArea 126.10/94.59 %21 = load %length2 126.10/94.59 %22 = sext i32 %21 to i64 126.10/94.59 %23 = mul %22 1 126.10/94.59 %24 = alloca i8, numElementsLit: %23 126.10/94.59 store %24, %nondetString 126.10/94.59 %25 = load %length2 126.10/94.59 %26 = sub %25 1 126.10/94.59 %27 = sext i32 %26 to i64 126.10/94.59 %28 = load %nondetString 126.10/94.59 %29 = getelementptr %28, %27 126.10/94.59 store 0, %29 126.10/94.59 %30 = load %nondetArea 126.10/94.59 %31 = load %nondetString 126.10/94.59 %32 = call *i8 @cstrcpy(*i8 %30, *i8 %31) 126.10/94.59 store 0, %1 126.10/94.59 br %33 126.10/94.59 33: 126.10/94.59 %34 = load %1 126.10/94.59 ret %34 126.10/94.59 126.10/94.59 126.10/94.59 Analyze Termination of all function calls matching the pattern: 126.10/94.59 main() 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (3) LLVMToTerminationGraphProof (EQUIVALENT) 126.10/94.59 Constructed symbolic execution graph for LLVM program and proved memory safety. 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (4) 126.10/94.59 Obligation: 126.10/94.59 SE Graph 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (5) SymbolicExecutionGraphToSCCProof (SOUND) 126.10/94.59 Splitted symbolic execution graph to 1 SCC. 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (6) 126.10/94.59 Obligation: 126.10/94.59 SCC 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (7) SCC2IRS (SOUND) 126.10/94.59 Transformed LLVM symbolic execution graph SCC into a rewrite problem. Log: 126.10/94.59 Generated rules. Obtained 17 rulesP rules: 126.10/94.59 f_512(v455, v456, v457, v458, v459, v464, v461, v462, 1, v460, v465, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_513(v455, v456, v457, v458, v459, v464, v486, v462, v461, 1, v460, v465, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_513(v455, v456, v457, v458, v459, v464, v486, v462, v461, 1, v460, v465, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_514(v455, v456, v457, v458, v459, v464, v486, v465, v461, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: 0 = 0 126.10/94.59 f_514(v455, v456, v457, v458, v459, v464, v486, v465, v461, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_515(v455, v456, v457, v458, v459, v464, v486, v465, v461, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_515(v455, v456, v457, v458, v459, v464, v486, v465, v461, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_516(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: 0 = 0 126.10/94.59 f_516(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_517(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: v486 != 0 && v464 < v475 && 3 <= v475 126.10/94.59 f_517(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_519(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: 0 = 0 126.10/94.59 f_519(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_521(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_521(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_523(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_523(v455, v456, v457, v458, v459, v464, v486, v465, 1, v460, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_525(v455, v456, v457, v458, v459, v464, v486, v465, 1, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: 0 = 0 126.10/94.59 f_525(v455, v456, v457, v458, v459, v464, v486, v465, 1, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_527(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: v507 = 1 + v464 && 3 <= v507 126.10/94.59 f_527(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_529(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_529(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v462, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_531(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: 0 = 0 126.10/94.59 f_531(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_533(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: v548 = 1 + v465 && 3 <= v548 && 3 <= v481 126.10/94.59 f_533(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_534(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_534(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_535(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_535(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, v460, v461, v462, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_511(v455, v456, v457, v458, v459, v464, v486, v465, 1, v507, v548, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: TRUE 126.10/94.59 f_511(v455, v456, v457, v458, v459, v460, v461, v462, 1, v464, v465, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) -> f_512(v455, v456, v457, v458, v459, v464, v461, v462, 1, v460, v465, v466, v476, v467, v477, v468, v478, v469, v479, v470, v480, v481, v475, v482, v483, v484, v485, 0, v471, v472, v474, 3, 7, 2, 4, 8) :|: 0 = 0 126.10/94.59 Combined rules. Obtained 2 rulesP rules: 126.10/94.59 f_512(v455:0, v456:0, v457:0, v458:0, v459:0, v464:0, v461:0, v462:0, 1, v460:0, v465:0, v466:0, v476:0, v467:0, v477:0, v468:0, v478:0, v469:0, v479:0, v470:0, v480:0, v481:0, v475:0, v482:0, v483:0, v484:0, v485:0, 0, v471:0, v472:0, v474:0, 3, 7, 2, 4, 8) -> f_512(v455:0, v456:0, v457:0, v458:0, v459:0, 1 + v464:0, v486:0, v465:0, 1, v464:0, 1 + v465:0, v466:0, v476:0, v467:0, v477:0, v468:0, v478:0, v469:0, v479:0, v470:0, v480:0, v481:0, v475:0, v482:0, v483:0, v484:0, v485:0, 0, v471:0, v472:0, v474:0, 3, 7, 2, 4, 8) :|: v475:0 > v464:0 && v486:0 < 0 && v475:0 > 2 && v464:0 > 1 && v481:0 > 2 && v465:0 > 1 126.10/94.59 f_512(v455:0, v456:0, v457:0, v458:0, v459:0, v464:0, v461:0, v462:0, 1, v460:0, v465:0, v466:0, v476:0, v467:0, v477:0, v468:0, v478:0, v469:0, v479:0, v470:0, v480:0, v481:0, v475:0, v482:0, v483:0, v484:0, v485:0, 0, v471:0, v472:0, v474:0, 3, 7, 2, 4, 8) -> f_512(v455:0, v456:0, v457:0, v458:0, v459:0, 1 + v464:0, v486:0, v465:0, 1, v464:0, 1 + v465:0, v466:0, v476:0, v467:0, v477:0, v468:0, v478:0, v469:0, v479:0, v470:0, v480:0, v481:0, v475:0, v482:0, v483:0, v484:0, v485:0, 0, v471:0, v472:0, v474:0, 3, 7, 2, 4, 8) :|: v475:0 > v464:0 && v486:0 > 0 && v475:0 > 2 && v464:0 > 1 && v481:0 > 2 && v465:0 > 1 126.10/94.59 Filtered unneeded arguments: 126.10/94.59 f_512(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36) -> f_512(x6, x11, x22, x23) 126.10/94.59 Removed division, modulo operations, cleaned up constraints. Obtained 1 rules.P rules: 126.10/94.59 f_512(v464:0, v465:0, v481:0, v475:0) -> f_512(1 + v464:0, 1 + v465:0, v481:0, v475:0) :|: v475:0 > 2 && v475:0 > v464:0 && v464:0 > 1 && v465:0 > 1 && v481:0 > 2 126.10/94.59 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (8) 126.10/94.59 Obligation: 126.10/94.59 Rules: 126.10/94.59 f_512(v464:0, v465:0, v481:0, v475:0) -> f_512(1 + v464:0, 1 + v465:0, v481:0, v475:0) :|: v475:0 > 2 && v475:0 > v464:0 && v464:0 > 1 && v465:0 > 1 && v481:0 > 2 126.10/94.59 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (9) IntTRSCompressionProof (EQUIVALENT) 126.10/94.59 Compressed rules. 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (10) 126.10/94.59 Obligation: 126.10/94.59 Rules: 126.10/94.59 f_512(v464:0:0, v465:0:0, v481:0:0, v475:0:0) -> f_512(1 + v464:0:0, 1 + v465:0:0, v481:0:0, v475:0:0) :|: v465:0:0 > 1 && v481:0:0 > 2 && v464:0:0 > 1 && v475:0:0 > v464:0:0 && v475:0:0 > 2 126.10/94.59 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (11) RankingReductionPairProof (EQUIVALENT) 126.10/94.59 Interpretation: 126.10/94.59 [ f_512 ] = -1*f_512_1 + f_512_4 126.10/94.59 126.10/94.59 The following rules are decreasing: 126.10/94.59 f_512(v464:0:0, v465:0:0, v481:0:0, v475:0:0) -> f_512(1 + v464:0:0, 1 + v465:0:0, v481:0:0, v475:0:0) :|: v465:0:0 > 1 && v481:0:0 > 2 && v464:0:0 > 1 && v475:0:0 > v464:0:0 && v475:0:0 > 2 126.10/94.59 126.10/94.59 The following rules are bounded: 126.10/94.59 f_512(v464:0:0, v465:0:0, v481:0:0, v475:0:0) -> f_512(1 + v464:0:0, 1 + v465:0:0, v481:0:0, v475:0:0) :|: v465:0:0 > 1 && v481:0:0 > 2 && v464:0:0 > 1 && v475:0:0 > v464:0:0 && v475:0:0 > 2 126.10/94.59 126.10/94.59 126.10/94.59 ---------------------------------------- 126.10/94.59 126.10/94.59 (12) 126.10/94.59 YES 126.10/94.64 EOF