|
| 1 | +#include <stdlib.h> |
| 2 | + |
| 3 | +int main() |
| 4 | +{ |
| 5 | + int a; |
| 6 | + __CPROVER_assume(a < 100); |
| 7 | + __CPROVER_assume(a > -100); |
| 8 | + __CPROVER_assume(a != 0); |
| 9 | + |
| 10 | + // Simple algebraic identities - expected to drive the SMT backend |
| 11 | + __CPROVER_assert(a + a == a * 2, "a plus a always equals two times a"); |
| 12 | + __CPROVER_assert(a - a == 0, "a minus a always equals 0"); |
| 13 | + __CPROVER_assert(a + -a == 0, "a plus its additive inverse equals 0"); |
| 14 | + __CPROVER_assert( |
| 15 | + a - -a == 2 * a, "a minus its additive inverse equals two times a"); |
| 16 | + __CPROVER_assert((a * a) / a == a, "a squared divided by a equals a"); |
| 17 | + __CPROVER_assert((2 * a) / a == 2, "two times a divided by a equals two"); |
| 18 | + __CPROVER_assert(a % a == 0, "a mod itself equals 0"); |
| 19 | + |
| 20 | + // Same round of tests, but for a type of different size |
| 21 | + long long int b; |
| 22 | + __CPROVER_assume(b < 100ll); |
| 23 | + __CPROVER_assume(b > -100ll); |
| 24 | + __CPROVER_assume(b != 0ll); |
| 25 | + |
| 26 | + __CPROVER_assert(b + b == b * 2ll, "b plus b always equals two times b"); |
| 27 | + __CPROVER_assert(b - b == 0ll, "b minus b always equals 0"); |
| 28 | + __CPROVER_assert(b + -b == 0ll, "b plus its additive inverse equals 0"); |
| 29 | + __CPROVER_assert( |
| 30 | + b - -b == 2ll * b, "b minus its additive inverse equals two times b"); |
| 31 | + __CPROVER_assert((b * b) / b == b, "b squared divided by b equals b"); |
| 32 | + __CPROVER_assert((2ll * b) / b == 2ll, "two times b divided by b equals two"); |
| 33 | + __CPROVER_assert(b % b == 0ll, "b mod itself equals 0"); |
| 34 | + |
| 35 | + char c = 0x0; |
| 36 | + __CPROVER_assume(c != 0x00); |
| 37 | + |
| 38 | + __CPROVER_assert(c + c == c * 0x2, "c plus c always equals two times c"); |
| 39 | + __CPROVER_assert(c - c == 0x0, "c minus c always equals 0"); |
| 40 | + __CPROVER_assert(c + -c == 0x0, "c plus its additive inverse equals 0"); |
| 41 | + __CPROVER_assert( |
| 42 | + c - -c == 0x2 * c, "c minus its additive inverse equals two times c"); |
| 43 | + __CPROVER_assert((c * c) / c == c, "c squared divided by c equals c"); |
| 44 | + __CPROVER_assert((0x2 * c) / c == 0x2, "two times c divided by c equals two"); |
| 45 | + __CPROVER_assert(c % c == 0x0, "c mod itself equals 0"); |
| 46 | +} |
0 commit comments