Skip to content

Commit b2b61a7

Browse files
committed
Using exists in __CPROVER_assume requires care
In some cases the assume is trivially true or trivially false.
1 parent eaf1209 commit b2b61a7

File tree

3 files changed

+27
-13
lines changed

3 files changed

+27
-13
lines changed

regression/cbmc/Quantifiers-not-exists/main.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,20 @@ int main()
1010
// clang-format would rewrite the "==>" as "== >"
1111
__CPROVER_assume(!__CPROVER_exists { int i; (i>=0 && i<2) ==> (__CPROVER_exists{int j; (j>=0 && j<2) ==> a[i][j]<=10}) });
1212

13+
assert(0);
14+
1315
__CPROVER_assume(__CPROVER_forall { int i; (i>=0 && i<2) ==> (!__CPROVER_exists{int j; (j>=0 && j<2) ==> b[i][j]>=1 && b[i][j]<=10}) });
1416

17+
assert(0);
18+
1519
__CPROVER_assume(!__CPROVER_exists { int i; (i>=0 && i<2) ==> (!__CPROVER_exists{int j; (j>=0 && j<2) ==> c[i][j]>=1 && c[i][j]<=10}) });
1620

21+
assert(0);
22+
1723
__CPROVER_assume(!__CPROVER_exists { int i; (i>=0 && i<2) ==> (__CPROVER_forall{int j; (j>=0 && j<2) ==> d[i][j]>=1 && d[i][j]<=10}) });
1824
// clang-format on
1925

26+
assert(0);
2027

2128
assert(a[0][0]>10);
2229

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
CORE
1+
KNOWNBUG
22
main.c
33

44
^\*\* Results:$
5-
^\[main.assertion.1\] line 21 assertion a\[.*\]\[.*\] > 10: SUCCESS$
6-
^\[main.assertion.2\] line 23 assertion tmp_if_expr\$\d+: SUCCESS$
7-
^\[main.assertion.3\] line 24 assertion tmp_if_expr\$\d+: SUCCESS$
8-
^\[main.assertion.4\] line 26 assertion tmp_if_expr\$\d+: SUCCESS$
9-
^\[main.assertion.5\] line 28 assertion tmp_if_expr\$\d+: SUCCESS$
10-
^\[main.assertion.6\] line 29 assertion tmp_if_expr\$\d+: SUCCESS$
11-
^\*\* 0 of 6 failed
5+
^\[main.assertion.5\] line 28 assertion a\[.*\]\[.*\] > 10: SUCCESS$
6+
^\[main.assertion.6\] line 30 assertion tmp_if_expr\$\d+: SUCCESS$
7+
^\[main.assertion.7\] line 31 assertion tmp_if_expr\$\d+: SUCCESS$
8+
^\[main.assertion.8\] line 33 assertion tmp_if_expr\$\d+: SUCCESS$
9+
^\[main.assertion.9\] line 35 assertion tmp_if_expr\$\d+: SUCCESS$
10+
^\[main.assertion.10\] line 36 assertion tmp_if_expr\$\d+: SUCCESS$
11+
^\*\* 0 of 10 failed
1212
^VERIFICATION SUCCESSFUL$
1313
^EXIT=0$
1414
^SIGNAL=0$
1515
--
1616
^warning: ignoring
17+
--
18+
All assertions are unreachable as each of the __CPROVER_assume evaluate to false
19+
(!exists i. i>=0 && i<2 ==> ... is equivalent to forall i. i>=0 && i<2 && ...,
20+
where neither i>=0 nor i<2 is actually true for all values of i).
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
CORE
1+
KNOWNBUG
22
main.c
33

44
^\*\* Results:$
55
^\[main.assertion.1\] line 12 assertion a\[.*\]\[.*\] == 0: SUCCESS$
66
^\[main.assertion.2\] line 13 assertion a\[.*\]\[.*\] == 1: SUCCESS$
77
^\[main.assertion.3\] line 14 assertion a\[.*\]\[.*\] == 1: SUCCESS$
88
^\[main.assertion.4\] line 15 assertion a\[.*\]\[.*\] == 2: SUCCESS$
9-
^\[main.assertion.5\] line 16 assertion tmp_if_expr\$\d+: SUCCESS$
10-
^\*\* 0 of 5 failed
11-
^VERIFICATION SUCCESSFUL$
12-
^EXIT=0$
9+
^\[main.assertion.5\] line 16 assertion tmp_if_expr\$\d+: FAILURE$
10+
^\*\* 1 of 5 failed
11+
^VERIFICATION FAILED$
12+
^EXIT=10$
1313
^SIGNAL=0$
1414
--
1515
^warning: ignoring
16+
--
17+
The assertion on line 13 need not hold as the assume can be satisfied by picking
18+
a value for i that does not fulfil the left-hand side of the implication.

0 commit comments

Comments
 (0)