From 1c45a4c9247458b523601e400e8bcda42a428188 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Wed, 10 Mar 2021 15:31:30 +0100 Subject: [PATCH] [wp] Fix assigns labels for called functions --- src/plugins/wp/cfgAnnot.ml | 6 +++++- src/plugins/wp/tests/wp_acsl/old-assigns.c | 12 ++++++++++++ .../wp_acsl/oracle/old-assigns.res.oracle | 19 +++++++++++++++++++ .../oracle_qualif/old-assigns.res.oracle | 13 +++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/plugins/wp/tests/wp_acsl/old-assigns.c create mode 100644 src/plugins/wp/tests/wp_acsl/oracle/old-assigns.res.oracle create mode 100644 src/plugins/wp/tests/wp_acsl/oracle_qualif/old-assigns.res.oracle diff --git a/src/plugins/wp/cfgAnnot.ml b/src/plugins/wp/cfgAnnot.ml index c837a3ede6b..f67f603fc98 100644 --- a/src/plugins/wp/cfgAnnot.ml +++ b/src/plugins/wp/cfgAnnot.ml @@ -247,13 +247,17 @@ module CallContract = WpContext.StaticGenerator(Kernel_function) List.iter (add wpost @@ mk_post Normal) bhv.b_post_cond ; List.iter (add wexit @@ mk_post Exits) bhv.b_post_cond ; end behaviors ; + let assigns = match assigns_upper_bound behaviors with + | WritesAny -> WritesAny + | Writes froms -> Writes (normalize_froms Normal froms) + in { contract_cond = List.rev !wcond ; contract_hpre = List.rev !whpre ; contract_post = List.rev !wpost ; contract_exit = List.rev !wexit ; contract_smoke = [] ; - contract_assigns = assigns_upper_bound behaviors + contract_assigns = assigns } end) diff --git a/src/plugins/wp/tests/wp_acsl/old-assigns.c b/src/plugins/wp/tests/wp_acsl/old-assigns.c new file mode 100644 index 00000000000..d15399639e4 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/old-assigns.c @@ -0,0 +1,12 @@ +#include <string.h> + +/*@ assigns dest[0..strlen{Old}(src)]; @*/ +void strcpy_OLD(char *restrict dest, const char *restrict src); + +/*@ + requires \separated(dest+(0..), src+(0..)); + assigns dest[0..strlen(src)]; +*/ +void old(char *dest, const char *src) { + strcpy_OLD(dest, src); +} diff --git a/src/plugins/wp/tests/wp_acsl/oracle/old-assigns.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/old-assigns.res.oracle new file mode 100644 index 00000000000..568225a6abd --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle/old-assigns.res.oracle @@ -0,0 +1,19 @@ +# frama-c -wp [...] +[kernel] Parsing tests/wp_acsl/old-assigns.c (with preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function old +------------------------------------------------------------ + +Goal Assigns (file tests/wp_acsl/old-assigns.c, line 8) in 'old': +Call Effect at line 11 +Prove: true. + +------------------------------------------------------------ + +Goal Assigns (file tests/wp_acsl/old-assigns.c, line 8) in 'old': +Call Effect at line 11 +Prove: true. + +------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/old-assigns.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/old-assigns.res.oracle new file mode 100644 index 00000000000..9d6f2033859 --- /dev/null +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/old-assigns.res.oracle @@ -0,0 +1,13 @@ +# frama-c -wp [...] +[kernel] Parsing tests/wp_acsl/old-assigns.c (with preprocessing) +[wp] Running WP plugin... +[wp] Warning: Missing RTE guards +[wp] 2 goals scheduled +[wp] [Qed] Goal typed_old_assigns_exit : Valid +[wp] [Qed] Goal typed_old_assigns_normal : Valid +[wp] Proved goals: 2 / 2 + Qed: 2 +------------------------------------------------------------ + Functions WP Alt-Ergo Total Success + old 2 - 2 100% +------------------------------------------------------------ -- GitLab