Skip to content

Commit

Permalink
Use demonic tracking for is_fresh
Browse files Browse the repository at this point in the history
  • Loading branch information
Remi Delmas committed Jan 21, 2025
1 parent e965339 commit 0e0aaeb
Show file tree
Hide file tree
Showing 30 changed files with 563 additions and 85 deletions.
32 changes: 6 additions & 26 deletions regression/contracts-dfcc/test_aliasing_ensure/main.c
Original file line number Diff line number Diff line change
@@ -1,35 +1,15 @@
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>

int z;

int *foo()
// clang-format off
int foo(int *x, int *y)
__CPROVER_assigns(z, *x)
__CPROVER_requires(
__CPROVER_is_fresh(x, sizeof(int)) &&
*x > 0 &&
*x < 4)
__CPROVER_ensures(
__CPROVER_is_fresh(y, sizeof(int)) &&
!__CPROVER_is_fresh(x, sizeof(int)) &&
x != NULL &&
x != y &&
__CPROVER_return_value == *x + 5)
__CPROVER_ensures(__CPROVER_is_fresh(__CPROVER_return_value, sizeof(int)))
// clang-format on
{
*x = *x + 4;
y = malloc(sizeof(*y));
*y = *x;
z = *y;
return (*x + 5);
int* ret = malloc(sizeof(int));
__CPROVER_assume(ret);
return ret;
}

int main()
{
int n = 4;
n = foo(&n, &n);
assert(!(n < 4));
foo();
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(__CPROVER_pointer_equals(y, sizeof(int)) && __CPROVER_pointer_equals(y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^\[__CPROVER_contracts_pointer_equals.assertion.\d+\] line \d+ __CPROVER_pointer_equals does not conflict with other predicate: FAILURE$
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
--
--
Tests that assuming the more than one pointer predicate on the same target pointer
at the same time triggers a failure.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(__CPROVER_pointer_equals(y, x) || __CPROVER_pointer_equals(y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1 || *x == 0)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^EXIT=0$
^SIGNAL=0$
^VERIFICATION SUCCESSFULL$
--
--
Tests that a same pointer can be the target of multiple pointer predicates as
long as they do not apply at the same time.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(
__CPROVER_pointer_in_range_dfcc(x, y, x) &&
__CPROVER_pointer_equals(y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^\[__CPROVER_contracts_pointer_in_range_dfcc.assertion.\d+\] line \d+ __CPROVER_pointer_in_range_dfcc does not conflict with other predicate: FAILURE$
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
--
--
Tests that assuming the more than one pointer predicate on the same target pointer
at the same time triggers a failure.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(
__CPROVER_pointer_in_range_dfcc(x, y, x) &&
__CPROVER_pointer_equals(y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^EXIT=0$
^SIGNAL=0$
^VERIFICATION SUCCESSFULL$
--
--
Tests that a same pointer can be the target of multiple pointer predicates as
long as they do not apply at the same time.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(
__CPROVER_pointer_in_range_dfcc(x, y, x) &&
__CPROVER_pointer_in_range_dfcc(x, y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^EXIT=0$
^SIGNAL=0$
^VERIFICATION SUCCESSFULL$
--
--
Tests that a same pointer can be the target of multiple pointer predicates as
long as they do not apply at the same time.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(__CPROVER_is_fresh(y, sizeof(int)) && __CPROVER_pointer_equals(y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1 || *x == 0)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^\[__CPROVER_contracts_pointer_equals.assertion.\d+\] line \d+ __CPROVER_pointer_equals does not conflict with other predicate: FAILURE$
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
--
--
Tests that assuming the more than one pointer predicate on the same target pointer
at the same time triggers a failure.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(__CPROVER_is_fresh(y, sizeof(int)) || __CPROVER_pointer_equals(y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1 || *x == 0)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^EXIT=0$
^SIGNAL=0$
^VERIFICATION SUCCESSFULL$
--
--
Tests that a same pointer can be the target of multiple pointer predicates as
long as they do not apply at the same time.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(
__CPROVER_is_fresh(y, sizeof(int)) &&
__CPROVER_pointer_in_range_dfcc(x, y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1 || *x == 0)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^\[__CPROVER_contracts_pointer_in_range_dfcc.assertion.\d+\] line \d+ __CPROVER_pointer_in_range_dfcc does not conflict with other predicate: FAILURE$
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
--
--
Tests that assuming the more than one pointer predicate on the same target pointer
at the same time triggers a failure.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
void foo(int *x, int *y)
// clang-format off
__CPROVER_requires(__CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_requires(*x == 0)
__CPROVER_requires(x[SIZE-1] == 0)
__CPROVER_requires(
__CPROVER_is_fresh(y, sizeof(int)) ||
__CPROVER_pointer_in_range_dfcc(x, y, x))
__CPROVER_assigns(*y)
__CPROVER_ensures(*y == 1)
__CPROVER_ensures(*x == 1 || *x == 0)
// clang-format on
{
*y = 1;
}

int main()
{
int *x;
int *y;
foo(x, y);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^EXIT=0$
^SIGNAL=0$
^VERIFICATION SUCCESSFULL$
--
--
Tests that a same pointer can be the target of multiple pointer predicates as
long as they do not apply at the same time.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
void foo(int *x)
// clang-format off
__CPROVER_requires(
__CPROVER_is_fresh(x, sizeof(int)) && __CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_assigns(*x)
__CPROVER_ensures(*x == 0)
// clang-format on
{
*x = 0;
}

int main()
{
int *x;
foo(x);
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CORE dfcc-only
main.c
--dfcc main --enforce-contract foo
^\[__CPROVER_contracts_is_fresh.assertion.\d+\] line \d+ __CPROVER_is_fresh does not conflict with other predicate: FAILURE$
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
--
--
Tests that assuming the more than one pointer predicate on the same target pointer
at the same time triggers a failure.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
void foo(int *x)
// clang-format off
__CPROVER_requires(
__CPROVER_is_fresh(x, sizeof(int)) || __CPROVER_is_fresh(x, sizeof(int)))
__CPROVER_assigns(*x)
__CPROVER_ensures(*x == 0)
// clang-format on
{
*x = 0;
}

int main()
{
int *x;
foo(x);
return 0;
}
Loading

0 comments on commit 0e0aaeb

Please sign in to comment.