forked from diffblue/cbmc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Remi Delmas
committed
Jan 21, 2025
1 parent
e965339
commit 0e0aaeb
Showing
30 changed files
with
563 additions
and
85 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
20 changes: 20 additions & 0 deletions
20
regression/contracts-dfcc/test_pointer_predicate_enforce_requires_equals_equals_fail/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
11 changes: 11 additions & 0 deletions
11
...ssion/contracts-dfcc/test_pointer_predicate_enforce_requires_equals_equals_fail/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
20 changes: 20 additions & 0 deletions
20
regression/contracts-dfcc/test_pointer_predicate_enforce_requires_equals_equals_pass/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
10 changes: 10 additions & 0 deletions
10
...ssion/contracts-dfcc/test_pointer_predicate_enforce_requires_equals_equals_pass/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
22 changes: 22 additions & 0 deletions
22
...ession/contracts-dfcc/test_pointer_predicate_enforce_requires_in_range_equals_fail/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
11 changes: 11 additions & 0 deletions
11
...ion/contracts-dfcc/test_pointer_predicate_enforce_requires_in_range_equals_fail/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
22 changes: 22 additions & 0 deletions
22
...ession/contracts-dfcc/test_pointer_predicate_enforce_requires_in_range_equals_pass/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
10 changes: 10 additions & 0 deletions
10
...ion/contracts-dfcc/test_pointer_predicate_enforce_requires_in_range_equals_pass/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
22 changes: 22 additions & 0 deletions
22
...sion/contracts-dfcc/test_pointer_predicate_enforce_requires_in_range_in_range_pass/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
10 changes: 10 additions & 0 deletions
10
...n/contracts-dfcc/test_pointer_predicate_enforce_requires_in_range_in_range_pass/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
20 changes: 20 additions & 0 deletions
20
...ession/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_equals_fail/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
11 changes: 11 additions & 0 deletions
11
...ion/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_equals_fail/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
20 changes: 20 additions & 0 deletions
20
...ession/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_equals_pass/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
10 changes: 10 additions & 0 deletions
10
...ion/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_equals_pass/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
22 changes: 22 additions & 0 deletions
22
...sion/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_in_range_fail/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
11 changes: 11 additions & 0 deletions
11
...n/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_in_range_fail/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
23 changes: 23 additions & 0 deletions
23
...sion/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_in_range_pass/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
10 changes: 10 additions & 0 deletions
10
...n/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_in_range_pass/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
17 changes: 17 additions & 0 deletions
17
...sion/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_is_fresh_fail/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
11 changes: 11 additions & 0 deletions
11
...n/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_is_fresh_fail/test.desc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
17 changes: 17 additions & 0 deletions
17
...sion/contracts-dfcc/test_pointer_predicate_enforce_requires_is_fresh_is_fresh_pass/main.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
Oops, something went wrong.