From a6fd927e3b9589617d6c6b0c34c39994e6da6b76 Mon Sep 17 00:00:00 2001 From: Basile Desloges <basile.desloges@cea.fr> Date: Wed, 18 Sep 2024 19:32:03 +0200 Subject: [PATCH] [libc] Update tests oracles --- tests/basic/oracle/placement_new.res.oracle | 33 +++++++++ tests/basic/oracle/placement_newb.res.oracle | 33 +++++++++ tests/stl/oracle/stl_algorithm.res.oracle | 17 +++++ tests/stl/oracle/stl_bool.res.oracle | 17 +++++ tests/stl/oracle/stl_functional.res.oracle | 17 +++++ tests/stl/oracle/stl_memory.res.oracle | 17 +++++ .../stl_shared_ptr_mistake10.res.oracle | 50 +++++++++++++ .../oracle/stl_shared_ptr_mistake5.res.oracle | 50 +++++++++++++ .../oracle/stl_shared_ptr_mistake6.res.oracle | 50 +++++++++++++ tests/stl/oracle/stl_system_error.res.oracle | 72 +++++++++++++++++++ tests/stl/oracle/stl_typeinfo.res.oracle | 17 +++++ tests/stl/oracle/stl_unique_ptr.res.oracle | 17 +++++ 12 files changed, 390 insertions(+) diff --git a/tests/basic/oracle/placement_new.res.oracle b/tests/basic/oracle/placement_new.res.oracle index 52d46f48..c0a55022 100644 --- a/tests/basic/oracle/placement_new.res.oracle +++ b/tests/basic/oracle/placement_new.res.oracle @@ -977,6 +977,18 @@ char *__fc_env[4096]; */ char *getenv(char const *name); +/*@ requires valid_name: valid_read_string(name); + ensures + null_or_valid_result: + \result ≡ \null ∨ + (\valid(\result) ∧ valid_read_string(\result)); + assigns \result; + assigns \result + \from __fc_env[0 ..], (indirect: name), + (indirect: *(name + (0 .. strlen{Old}(name)))); + */ +char *secure_getenv(char const *name); + /*@ requires valid_string: valid_read_string(string); assigns __fc_env[0 ..], \result; assigns __fc_env[0 ..] \from __fc_env[0 ..], string; @@ -1283,6 +1295,16 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); */ int mkstemp(char *templat); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemp(char *templat, int flags); + /*@ requires valid_template: valid_string(templat); requires template_len: strlen(templat) ≥ 6 + suffixlen; requires non_negative_suffixlen: suffixlen ≥ 0; @@ -1294,6 +1316,17 @@ int mkstemp(char *templat); */ int mkstemps(char *templat, int suffixlen); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6 + suffixlen; + requires non_negative_suffixlen: suffixlen ≥ 0; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemps(char *templat, int suffixlen, int flags); + /*@ requires valid_file_name_or_null: file_name ≡ \null ∨ valid_read_string(file_name); diff --git a/tests/basic/oracle/placement_newb.res.oracle b/tests/basic/oracle/placement_newb.res.oracle index 6d9ce932..60c099f1 100644 --- a/tests/basic/oracle/placement_newb.res.oracle +++ b/tests/basic/oracle/placement_newb.res.oracle @@ -946,6 +946,18 @@ char *__fc_env[4096]; */ char *getenv(char const *name); +/*@ requires valid_name: valid_read_string(name); + ensures + null_or_valid_result: + \result ≡ \null ∨ + (\valid(\result) ∧ valid_read_string(\result)); + assigns \result; + assigns \result + \from __fc_env[0 ..], (indirect: name), + (indirect: *(name + (0 .. strlen{Old}(name)))); + */ +char *secure_getenv(char const *name); + /*@ requires valid_string: valid_read_string(string); assigns __fc_env[0 ..], \result; assigns __fc_env[0 ..] \from __fc_env[0 ..], string; @@ -1252,6 +1264,16 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); */ int mkstemp(char *templat); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemp(char *templat, int flags); + /*@ requires valid_template: valid_string(templat); requires template_len: strlen(templat) ≥ 6 + suffixlen; requires non_negative_suffixlen: suffixlen ≥ 0; @@ -1263,6 +1285,17 @@ int mkstemp(char *templat); */ int mkstemps(char *templat, int suffixlen); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6 + suffixlen; + requires non_negative_suffixlen: suffixlen ≥ 0; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemps(char *templat, int suffixlen, int flags); + /*@ requires valid_file_name_or_null: file_name ≡ \null ∨ valid_read_string(file_name); diff --git a/tests/stl/oracle/stl_algorithm.res.oracle b/tests/stl/oracle/stl_algorithm.res.oracle index e284b217..59625dd7 100644 --- a/tests/stl/oracle/stl_algorithm.res.oracle +++ b/tests/stl/oracle/stl_algorithm.res.oracle @@ -918,6 +918,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires diff --git a/tests/stl/oracle/stl_bool.res.oracle b/tests/stl/oracle/stl_bool.res.oracle index 4af3c386..829261aa 100644 --- a/tests/stl/oracle/stl_bool.res.oracle +++ b/tests/stl/oracle/stl_bool.res.oracle @@ -566,6 +566,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires diff --git a/tests/stl/oracle/stl_functional.res.oracle b/tests/stl/oracle/stl_functional.res.oracle index 99cabc73..1c2137f4 100644 --- a/tests/stl/oracle/stl_functional.res.oracle +++ b/tests/stl/oracle/stl_functional.res.oracle @@ -726,6 +726,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires diff --git a/tests/stl/oracle/stl_memory.res.oracle b/tests/stl/oracle/stl_memory.res.oracle index 4f6cffd8..c415a960 100644 --- a/tests/stl/oracle/stl_memory.res.oracle +++ b/tests/stl/oracle/stl_memory.res.oracle @@ -732,6 +732,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires diff --git a/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle b/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle index 7678d4c0..ba1f6ee9 100644 --- a/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle +++ b/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle @@ -747,6 +747,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires @@ -3233,6 +3250,18 @@ char *__fc_env[4096]; */ char *getenv(char const *name); +/*@ requires valid_name: valid_read_string(name); + ensures + null_or_valid_result: + \result ≡ \null ∨ + (\valid(\result) ∧ valid_read_string(\result)); + assigns \result; + assigns \result + \from __fc_env[0 ..], (indirect: name), + (indirect: *(name + (0 .. strlen{Old}(name)))); + */ +char *secure_getenv(char const *name); + /*@ requires valid_string: valid_read_string(string); assigns __fc_env[0 ..], \result; assigns __fc_env[0 ..] \from __fc_env[0 ..], string; @@ -3539,6 +3568,16 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); */ int mkstemp(char *templat); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemp(char *templat, int flags); + /*@ requires valid_template: valid_string(templat); requires template_len: strlen(templat) ≥ 6 + suffixlen; requires non_negative_suffixlen: suffixlen ≥ 0; @@ -3550,6 +3589,17 @@ int mkstemp(char *templat); */ int mkstemps(char *templat, int suffixlen); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6 + suffixlen; + requires non_negative_suffixlen: suffixlen ≥ 0; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemps(char *templat, int suffixlen, int flags); + /*@ requires valid_file_name_or_null: file_name ≡ \null ∨ valid_read_string(file_name); diff --git a/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle b/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle index cbcdd2f4..dafb7e18 100644 --- a/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle +++ b/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle @@ -728,6 +728,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires @@ -3012,6 +3029,18 @@ char *__fc_env[4096]; */ char *getenv(char const *name); +/*@ requires valid_name: valid_read_string(name); + ensures + null_or_valid_result: + \result ≡ \null ∨ + (\valid(\result) ∧ valid_read_string(\result)); + assigns \result; + assigns \result + \from __fc_env[0 ..], (indirect: name), + (indirect: *(name + (0 .. strlen{Old}(name)))); + */ +char *secure_getenv(char const *name); + /*@ requires valid_string: valid_read_string(string); assigns __fc_env[0 ..], \result; assigns __fc_env[0 ..] \from __fc_env[0 ..], string; @@ -3318,6 +3347,16 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); */ int mkstemp(char *templat); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemp(char *templat, int flags); + /*@ requires valid_template: valid_string(templat); requires template_len: strlen(templat) ≥ 6 + suffixlen; requires non_negative_suffixlen: suffixlen ≥ 0; @@ -3329,6 +3368,17 @@ int mkstemp(char *templat); */ int mkstemps(char *templat, int suffixlen); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6 + suffixlen; + requires non_negative_suffixlen: suffixlen ≥ 0; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemps(char *templat, int suffixlen, int flags); + /*@ requires valid_file_name_or_null: file_name ≡ \null ∨ valid_read_string(file_name); diff --git a/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle b/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle index 95e22c3c..efead2b1 100644 --- a/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle +++ b/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle @@ -729,6 +729,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires @@ -3018,6 +3035,18 @@ char *__fc_env[4096]; */ char *getenv(char const *name); +/*@ requires valid_name: valid_read_string(name); + ensures + null_or_valid_result: + \result ≡ \null ∨ + (\valid(\result) ∧ valid_read_string(\result)); + assigns \result; + assigns \result + \from __fc_env[0 ..], (indirect: name), + (indirect: *(name + (0 .. strlen{Old}(name)))); + */ +char *secure_getenv(char const *name); + /*@ requires valid_string: valid_read_string(string); assigns __fc_env[0 ..], \result; assigns __fc_env[0 ..] \from __fc_env[0 ..], string; @@ -3324,6 +3353,16 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); */ int mkstemp(char *templat); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemp(char *templat, int flags); + /*@ requires valid_template: valid_string(templat); requires template_len: strlen(templat) ≥ 6 + suffixlen; requires non_negative_suffixlen: suffixlen ≥ 0; @@ -3335,6 +3374,17 @@ int mkstemp(char *templat); */ int mkstemps(char *templat, int suffixlen); +/*@ requires valid_template: valid_string(templat); + requires template_len: strlen(templat) ≥ 6 + suffixlen; + requires non_negative_suffixlen: suffixlen ≥ 0; + ensures + result_error_or_valid_fd: \result ≡ -1 ∨ (0 ≤ \result < 16); + assigns *(templat + (0 ..)), \result; + assigns *(templat + (0 ..)) \from \nothing; + assigns \result \from \nothing; + */ +int mkostemps(char *templat, int suffixlen, int flags); + /*@ requires valid_file_name_or_null: file_name ≡ \null ∨ valid_read_string(file_name); diff --git a/tests/stl/oracle/stl_system_error.res.oracle b/tests/stl/oracle/stl_system_error.res.oracle index 577d46bc..7f858371 100644 --- a/tests/stl/oracle/stl_system_error.res.oracle +++ b/tests/stl/oracle/stl_system_error.res.oracle @@ -54,6 +54,11 @@ typedef void *exception_ptr; struct nested_exception { struct _frama_c_vmt *pvmt ; }; +struct __fc_mbstate_t { + int __count ; + char __value[4] ; +}; +typedef struct __fc_mbstate_t mbstate_t; typedef unsigned int uid_t; typedef long time_t; struct __fc_FILE { @@ -102,6 +107,8 @@ struct tm { int tm_wday ; int tm_yday ; int tm_isdst ; + long tm_gmtoff ; + char const *tm_zone ; }; typedef char char_type; typedef wchar_t char_type; @@ -643,6 +650,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires @@ -1852,6 +1876,24 @@ int sigaction(int signum, struct sigaction const * restrict act, int sigprocmask(int how, sigset_t const * restrict set, sigset_t * restrict oldset); +/*@ requires valid_set_or_null: set ≡ \null ∨ \valid_read(set); + requires valid_how: set ≢ \null ⇒ how ∈ {0, 2, 1}; + requires valid_oldset_or_null: oldset ≡ \null ∨ \valid(oldset); + requires + separation: (set ≡ oldset ≡ \null) ∨ \separated(set, oldset); + ensures result_ok_or_error: \result ≡ 0 ∨ \result ≡ -1; + ensures + initialization: oldset_initialized: + \old(oldset) ≢ \null ∧ \result ≡ 0 ⇒ + \initialized(\old(oldset)); + assigns \result, *oldset; + assigns \result + \from (indirect: how), (indirect: set), (indirect: oldset); + assigns *oldset \from (indirect: how), (indirect: oldset); + */ +int pthread_sigmask(int how, sigset_t const * restrict set, + sigset_t * restrict oldset); + /*@ requires valid_mask_or_null: sigmask ≡ \null ∨ \valid_read(sigmask); ensures result_means_interrupted: \result ≡ -1; ensures errno_set: __fc_errno ≡ 4; @@ -1970,6 +2012,16 @@ struct tm *gmtime(time_t const *timer); */ struct tm *localtime(time_t const *timer); +/*@ requires valid_tm: \valid(tm); + ensures result_err_or_valid: \result ≡ -1 ∨ \result ≥ 0; + ensures + maybe_error: __fc_errno ≡ \old(__fc_errno) ∨ __fc_errno ≡ 75; + assigns \result, *tm; + assigns \result \from *tm; + assigns *tm \from *tm; + */ +time_t timegm(struct tm *tm); + /*@ requires dst_has_room: \valid(s + (0 .. max - 1)); requires valid_format: valid_read_string(format); requires valid_tm: \valid_read(tm); @@ -2499,6 +2551,26 @@ int wcscasecmp(wchar_t const *ws1, wchar_t const *ws2); */ wchar_t *wcsdup(wchar_t const *ws); +/*@ requires + valid_mbstate: initialization: + ps ≡ \null ∨ (\valid_read(ps) ∧ \initialized(ps)); + ensures ok_or_error: \result ≥ 0; + assigns \result; + assigns \result \from (indirect: ps), (indirect: *ps); + */ +int mbsinit(mbstate_t const *ps); + +/*@ assigns \result, *pwc, *ps; + assigns \result + \from (indirect: *(s + (0 .. n))), (indirect: n), (indirect: ps); + assigns *pwc + \from (indirect: *(s + (0 .. n))), (indirect: n), (indirect: ps); + assigns *ps + \from (indirect: *(s + (0 .. n))), (indirect: n), (indirect: ps); + */ +size_t mbrtowc(wchar_t * restrict pwc, char const * restrict s, size_t n, + mbstate_t * restrict ps); + struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info; /*@ requires \valid_read(c2); diff --git a/tests/stl/oracle/stl_typeinfo.res.oracle b/tests/stl/oracle/stl_typeinfo.res.oracle index 89634c84..8017c62c 100644 --- a/tests/stl/oracle/stl_typeinfo.res.oracle +++ b/tests/stl/oracle/stl_typeinfo.res.oracle @@ -501,6 +501,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires diff --git a/tests/stl/oracle/stl_unique_ptr.res.oracle b/tests/stl/oracle/stl_unique_ptr.res.oracle index e4a66590..042d9388 100644 --- a/tests/stl/oracle/stl_unique_ptr.res.oracle +++ b/tests/stl/oracle/stl_unique_ptr.res.oracle @@ -1225,6 +1225,23 @@ void *memchr(void const *s, int c, size_t n); */ void *memrchr(void const *s, int c, size_t n); +/*@ requires c_in_s: memchr((char *)s, c, \block_length(s) - 1) ≡ \true; + requires + valid: s: + \valid_read((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + requires + initialization: s: + \initialized((unsigned char *)s + + (0 .. memchr_off((char *)s, c, \block_length(s) - 1))); + ensures result_valid_read: \valid_read((char *)\result); + ensures result_same_base: \base_addr(\result) ≡ \base_addr(\old(s)); + assigns \result; + assigns \result + \from s, (indirect: c), (indirect: *((unsigned char *)s + (0 ..))); + */ +void *rawmemchr(void const *s, int c); + /*@ requires valid_dest: valid_or_empty(dest, n); requires valid_src: valid_read_or_empty(src, n); requires -- GitLab