File: main.c

package info (click to toggle)
cbmc 6.6.0-4
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 153,852 kB
  • sloc: cpp: 386,459; ansic: 114,466; java: 28,405; python: 6,003; yacc: 4,552; makefile: 4,041; lex: 2,487; xml: 2,388; sh: 2,050; perl: 557; pascal: 184; javascript: 163; ada: 36
file content (98 lines) | stat: -rw-r--r-- 2,152 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <assert.h>

void swap(int *a, int *b)
{
  *a ^= *b;
  *b ^= *a;
  *a ^= *b;
}

int main()
{
  int arr0, arr1, arr2, arr3, arr4;
  arr0 = 1;
  arr1 = 2;
  arr2 = 0;
  arr3 = 4;
  arr4 = 3;
  int *arr[5] = {&arr0, &arr1, &arr2, &arr3, &arr4};
  int pivot = 2;

  int h = 5 - 1;
  int l = 0;
  int r = 1;
  while(h > l)
    // clang-format off
    __CPROVER_assigns(arr0, arr1, arr2, arr3, arr4, h, l, r)
    __CPROVER_loop_invariant(
      // Turn off `clang-format` because it breaks the `==>` operator.
      h >= l &&
      0 <= l && l < 5 &&
      0 <= h && h < 5 &&
      l <= r && r <= h &&
      (r == 0 ==> arr0 == pivot) &&
      (r == 1 ==> arr1 == pivot) &&
      (r == 2 ==> arr2 == pivot) &&
      (r == 3 ==> arr3 == pivot) &&
      (r == 4 ==> arr4 == pivot) &&
      (0 < l ==> arr0 <= pivot) &&
      (1 < l ==> arr1 <= pivot) &&
      (2 < l ==> arr2 <= pivot) &&
      (3 < l ==> arr3 <= pivot) &&
      (4 < l ==> arr4 <= pivot) &&
      (0 > h ==> arr0 >= pivot) &&
      (1 > h ==> arr1 >= pivot) &&
      (2 > h ==> arr2 >= pivot) &&
      (3 > h ==> arr3 >= pivot) &&
      (4 > h ==> arr4 >= pivot)
    )
    __CPROVER_decreases(h - l)
    // clang-format on
    {
      if(*(arr[h]) <= pivot && *(arr[l]) >= pivot)
      {
        swap(arr[h], arr[l]);
        if(r == h)
        {
          r = l;
          h--;
        }
        else if(r == l)
        {
          r = h;
          l++;
        }
        else
        {
          h--;
          l++;
        }
      }
      else if(*(arr[h]) <= pivot)
      {
        l++;
      }
      else
      {
        h--;
      }
    }

  // Turn off `clang-format` because it breaks the `==>` operator.
  /* clang-format off */
  assert(0 <= r && r < 5);
  assert(*(arr[r]) == pivot);
  assert(0 < r ==> arr0 <= pivot);
  assert(1 < r ==> arr1 <= pivot);
  assert(2 < r ==> arr2 <= pivot);
  assert(3 < r ==> arr3 <= pivot);
  assert(4 < r ==> arr4 <= pivot);
  assert(0 > r ==> arr0 >= pivot);
  assert(1 > r ==> arr1 >= pivot);
  assert(2 > r ==> arr2 >= pivot);
  assert(3 > r ==> arr3 >= pivot);
  assert(4 > r ==> arr4 >= pivot);
  /* clang-format on */

  return r;
}