diff --git a/src/plugins/e-acsl/tests/bts/bts2252.c b/src/plugins/e-acsl/tests/bts/bts2252.c index c52b56d04f0cd46500998328172f2f3c9d3c43a3..7bd739ccc4fe5826554b48a894bb58c5c1264992 100644 --- a/src/plugins/e-acsl/tests/bts/bts2252.c +++ b/src/plugins/e-acsl/tests/bts/bts2252.c @@ -3,6 +3,7 @@ */ #include <stdlib.h> +#include <string.h> int main() { char* srcbuf = "Test Code"; diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle b/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle index 9516b93607c4dc48622167d15db9d2a662cdf286..c0d14a505d07b9519cd7815386d12346a4c15e42 100644 --- a/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle +++ b/src/plugins/e-acsl/tests/bts/oracle_ci/bts2252.res.oracle @@ -1,6 +1,25 @@ -[kernel:typing:implicit-function-declaration] tests/bts/bts2252.c:22: Warning: - Calling undeclared function strncpy. Old style K&R code? [e-acsl] beginning translation. +[e-acsl] Warning: annotating undefined function `strncpy': + the generated program may miss memory instrumentation + if there are memory-related annotations. +[e-acsl] FRAMAC_SHARE/libc/string.h:362: Warning: + E-ACSL construct `\separated' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/string.h:363: Warning: + E-ACSL construct `logic functions with labels' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/string.h:366: Warning: + E-ACSL construct `\separated' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/string.h:372: Warning: + E-ACSL construct `logic functions performing read accesses' + is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/string.h:372: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/string.h:375: Warning: + E-ACSL construct `logic functions performing read accesses' + is not yet supported. + Ignoring annotation. [e-acsl] translation done in project "e-acsl". -[eva:alarm] tests/bts/bts2252.c:17: Warning: +[eva:alarm] tests/bts/bts2252.c:18: Warning: out of bounds read. assert \valid_read(srcbuf + i); diff --git a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c index 4ee6b66b44b57196aa0861c7e89c5fcd16e2ea9f..989bcb1766bd17886c7cc66d06c696124849a70f 100644 --- a/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c +++ b/src/plugins/e-acsl/tests/bts/oracle_ci/gen_bts2252.c @@ -1,8 +1,149 @@ /* Generated by Frama-C */ #include "stdio.h" #include "stdlib.h" +#include "string.h" char *__gen_e_acsl_literal_string; -extern int ( /* missing proto */ strncpy)(char *x_0, char *x_1, int x_2); +extern int __e_acsl_sound_verdict; + +/*@ requires valid_nstring_src: valid_read_nstring(src, n); + requires room_nstring: \valid(dest + (0 .. n - 1)); + requires separation: \separated(dest + (0 .. n - 1), src + (0 .. n - 1)); + ensures result_ptr: \result ≡ \old(dest); + ensures initialization: \initialized(\old(dest) + (0 .. \old(n) - 1)); + assigns *(dest + (0 .. n - 1)), \result; + assigns *(dest + (0 .. n - 1)) \from *(src + (0 .. n - 1)); + assigns \result \from dest; + + behavior complete: + assumes src_fits: strlen(src) < n; + ensures equal_after_copy: strcmp(\old(dest), \old(src)) ≡ 0; + + behavior partial: + assumes src_too_long: n ≤ strlen(src); + ensures + equal_prefix: + memcmp{Post, Post}(\old(dest), \old(src), \old(n)) ≡ 0; + */ +char *__gen_e_acsl_strncpy(char * __restrict dest, + char const * __restrict src, size_t n); + +/*@ requires valid_nstring_src: valid_read_nstring(src, n); + requires room_nstring: \valid(dest + (0 .. n - 1)); + requires separation: \separated(dest + (0 .. n - 1), src + (0 .. n - 1)); + ensures result_ptr: \result ≡ \old(dest); + ensures initialization: \initialized(\old(dest) + (0 .. \old(n) - 1)); + assigns *(dest + (0 .. n - 1)), \result; + assigns *(dest + (0 .. n - 1)) \from *(src + (0 .. n - 1)); + assigns \result \from dest; + + behavior complete: + assumes src_fits: strlen(src) < n; + ensures equal_after_copy: strcmp(\old(dest), \old(src)) ≡ 0; + + behavior partial: + assumes src_too_long: n ≤ strlen(src); + ensures + equal_prefix: + memcmp{Post, Post}(\old(dest), \old(src), \old(n)) ≡ 0; + */ +char *__gen_e_acsl_strncpy(char * __restrict dest, + char const * __restrict src, size_t n) +{ + __e_acsl_mpz_t __gen_e_acsl_at_3; + char *__gen_e_acsl_at_2; + char *__gen_e_acsl_at; + char *__retres; + { + __e_acsl_mpz_t __gen_e_acsl_n; + __e_acsl_mpz_t __gen_e_acsl_; + __e_acsl_mpz_t __gen_e_acsl_sub; + __e_acsl_mpz_t __gen_e_acsl__2; + __e_acsl_mpz_t __gen_e_acsl_sub_2; + __e_acsl_mpz_t __gen_e_acsl_add; + unsigned long __gen_e_acsl__3; + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& dest),(size_t)8); + __gmpz_init_set_ui(__gen_e_acsl_n,n); + __gmpz_init_set_si(__gen_e_acsl_,1L); + __gmpz_init(__gen_e_acsl_sub); + __gmpz_sub(__gen_e_acsl_sub, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); + __gmpz_init_set_si(__gen_e_acsl__2,0L); + __gmpz_init(__gen_e_acsl_sub_2); + __gmpz_sub(__gen_e_acsl_sub_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__2)); + __gmpz_init(__gen_e_acsl_add); + __gmpz_add(__gen_e_acsl_add, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_2), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); + __gen_e_acsl__3 = __gmpz_get_ui((__e_acsl_mpz_struct const *)(__gen_e_acsl_add)); + __gen_e_acsl_valid = __e_acsl_valid((void *)(dest + 1 * 0), + __gen_e_acsl__3,(void *)dest, + (void *)(& dest)); + __e_acsl_assert(__gen_e_acsl_valid,"Precondition","strncpy", + "\\valid(dest + (0 .. n - 1))", + "FRAMAC_SHARE/libc/string.h",364); + __gmpz_clear(__gen_e_acsl_n); + __gmpz_clear(__gen_e_acsl_); + __gmpz_clear(__gen_e_acsl_sub); + __gmpz_clear(__gen_e_acsl__2); + __gmpz_clear(__gen_e_acsl_sub_2); + __gmpz_clear(__gen_e_acsl_add); + } + { + __e_acsl_mpz_t __gen_e_acsl_n_2; + __gmpz_init_set_ui(__gen_e_acsl_n_2,n); + __gmpz_init_set(__gen_e_acsl_at_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2)); + __gmpz_clear(__gen_e_acsl_n_2); + } + __gen_e_acsl_at_2 = dest; + __gen_e_acsl_at = dest; + __retres = strncpy(dest,src,n); + { + __e_acsl_mpz_t __gen_e_acsl__4; + __e_acsl_mpz_t __gen_e_acsl_sub_3; + __e_acsl_mpz_t __gen_e_acsl__5; + __e_acsl_mpz_t __gen_e_acsl_sub_4; + __e_acsl_mpz_t __gen_e_acsl_add_2; + unsigned long __gen_e_acsl__6; + int __gen_e_acsl_initialized; + __e_acsl_assert(__retres == __gen_e_acsl_at,"Postcondition","strncpy", + "\\result == \\old(dest)","FRAMAC_SHARE/libc/string.h", + 369); + __gmpz_init_set_si(__gen_e_acsl__4,1L); + __gmpz_init(__gen_e_acsl_sub_3); + __gmpz_sub(__gen_e_acsl_sub_3, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_at_3), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); + __gmpz_init_set_si(__gen_e_acsl__5,0L); + __gmpz_init(__gen_e_acsl_sub_4); + __gmpz_sub(__gen_e_acsl_sub_4, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_3), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__5)); + __gmpz_init(__gen_e_acsl_add_2); + __gmpz_add(__gen_e_acsl_add_2, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_sub_4), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__4)); + __gen_e_acsl__6 = __gmpz_get_ui((__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2)); + __gen_e_acsl_initialized = __e_acsl_initialized((void *)(__gen_e_acsl_at_2 + + 1 * 0), + __gen_e_acsl__6); + __e_acsl_assert(__gen_e_acsl_initialized,"Postcondition","strncpy", + "\\initialized(\\old(dest) + (0 .. \\old(n) - 1))", + "FRAMAC_SHARE/libc/string.h",370); + __e_acsl_delete_block((void *)(& dest)); + __gmpz_clear(__gen_e_acsl__4); + __gmpz_clear(__gen_e_acsl_sub_3); + __gmpz_clear(__gen_e_acsl__5); + __gmpz_clear(__gen_e_acsl_sub_4); + __gmpz_clear(__gen_e_acsl_add_2); + __gmpz_clear(__gen_e_acsl_at_3); + return __retres; + } +} void __e_acsl_globals_init(void) { @@ -29,6 +170,8 @@ int main(void) __e_acsl_full_init((void *)(& srcbuf)); int loc = 1; char *destbuf = malloc((unsigned long)10 * sizeof(char)); + __e_acsl_store_block((void *)(& destbuf),(size_t)8); + __e_acsl_full_init((void *)(& destbuf)); char ch = (char)'o'; if (destbuf != (char *)0) { i = -1; @@ -40,17 +183,19 @@ int main(void) (void *)srcbuf, (void *)(& srcbuf)); __e_acsl_assert(! __gen_e_acsl_valid_read,"Assertion","main", - "!\\valid_read(srcbuf + i)","tests/bts/bts2252.c",16); + "!\\valid_read(srcbuf + i)","tests/bts/bts2252.c",17); } /*@ assert ¬\valid_read(srcbuf + i); */ ; /*@ assert Eva: mem_access: \valid_read(srcbuf + i); */ if ((int)*(srcbuf + i) == (int)ch) loc = i; i ++; } - strncpy(destbuf + loc,srcbuf + loc,1); + __gen_e_acsl_strncpy(destbuf + loc,(char const *)(srcbuf + loc), + (unsigned long)1); free((void *)destbuf); } __retres = 0; + __e_acsl_delete_block((void *)(& destbuf)); __e_acsl_delete_block((void *)(& srcbuf)); __e_acsl_memory_clean(); return __retres;