From 38986ffc03c40da2ab32972d0b87684b00d0a7c1 Mon Sep 17 00:00:00 2001 From: Kilyan Le Gallic <kilyan.legallic@cea.fr> Date: Wed, 31 Jul 2024 16:29:20 +0200 Subject: [PATCH] [wp] Added tests for Why3 integration, oracles missing --- src/plugins/wp/tests/wp_gallery/euclid3.c | 43 +++++++++++++++++++ .../wp/tests/wp_gallery/external-import.c | 23 ++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/plugins/wp/tests/wp_gallery/euclid3.c create mode 100644 src/plugins/wp/tests/wp_gallery/external-import.c diff --git a/src/plugins/wp/tests/wp_gallery/euclid3.c b/src/plugins/wp/tests/wp_gallery/euclid3.c new file mode 100644 index 00000000000..8276d9682a6 --- /dev/null +++ b/src/plugins/wp/tests/wp_gallery/euclid3.c @@ -0,0 +1,43 @@ +#include <limits.h> + +//@ import why3: number::Gcd; + +//@ import why3: int::MinMax; + +/*@ + requires \abs(a) <= INT_MAX ; + requires \abs(b) <= INT_MAX ; + assigns \nothing; + ensures \result == Gcd::gcd(a,b); +*/ + +int euclid_gcd(int a, int b) +{ + int r; + /*@ + loop assigns a, b, r; + loop invariant Gcd::gcd(a,b) == \at( Gcd::gcd(a,b), Pre ); + loop variant \abs(b); + */ + while( b != 0 ) { + r = b ; + b = a % b ; + a = r ; + } + return a < 0 ? -a : a; +} + +/*@ + requires \abs(a) <= INT_MAX; + requires \abs(b) <= INT_MAX; + requires \abs(c) <= INT_MAX; + requires \abs(d) <= INT_MAX; + assigns \nothing; + ensures \result == Gcd::gcd(MinMax::min(a,b), MinMax::max(c,d) ); +*/ +int minmax_gcd(int a, int b, int c, int d) +{ + int x = (a > b) ? b : a; + int y = (c > d) ? c : d; + return euclid_gcd(x,y); +} diff --git a/src/plugins/wp/tests/wp_gallery/external-import.c b/src/plugins/wp/tests/wp_gallery/external-import.c new file mode 100644 index 00000000000..1751fa49264 --- /dev/null +++ b/src/plugins/wp/tests/wp_gallery/external-import.c @@ -0,0 +1,23 @@ +#include <limits.h> + +//@ import why3: summodule::Sum; + +/*@ + requires \abs(a) <= INT_MAX ; + requires \abs(b) <= INT_MAX ; + assigns \nothing; + ensures \result == Sum::sum(a,b); +*/ +int sum (int a, int b) { + + /*@ + loop assigns a, b; + loop invariant a <= a + b; + loop variant b; + */ + while( b != 0){ + a+=1; + b-=1; + } + return a; +} -- GitLab