diff options
author | Carlos O'Donell <carlos@redhat.com> | 2020-05-21 17:50:53 -0400 |
---|---|---|
committer | Carlos O'Donell <carlos@redhat.com> | 2020-06-01 12:26:32 -0400 |
commit | 61af4bbb2ae5a4eefc4c4243135747bbdb0f0684 (patch) | |
tree | 38a02e433414e331b7bf484b5a540f81864a8be0 /stdlib | |
parent | 9e2dc874e62b0950891b319c000b009ea12ac8c2 (diff) | |
download | glibc-61af4bbb2ae5a4eefc4c4243135747bbdb0f0684.tar.gz glibc-61af4bbb2ae5a4eefc4c4243135747bbdb0f0684.tar.xz glibc-61af4bbb2ae5a4eefc4c4243135747bbdb0f0684.zip |
mbstowcs: Document, test, and fix null pointer dst semantics (Bug 25219)
The function mbstowcs, by an XSI extension to POSIX, accepts a null pointer for the destination wchar_t array. This API behaviour allows you to use the function to compute the length of the required wchar_t array i.e. does the conversion without storing it and returns the number of wide characters required. We remove the __write_only__ markup for the first argument because it is not true since the destination may be a null pointer, and so the length argument may not apply. We remove the markup otherwise the new test case cannot be compiled with -Werror=nonnull. We add a new test case for mbstowcs which exercises the destination is a null pointer behaviour which we have now explicitly documented. The mbsrtowcs and mbsnrtowcs behave similarly, and mbsrtowcs is documented as doing this in C11, even if the standard doesn't come out and call out this specific use case. We add one note to each of mbsrtowcs and mbsnrtowcs to call out that they support a null pointer for the destination. The wcsrtombs function behaves similarly but in the other way around and allows you to use a null destination pointer to compute how many bytes you would need to convert the wide character input. We document this particular case also, but leave wcsnrtombs as a references to wcsrtombs, so the reader must still read the details of the semantics for wcsrtombs.
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/stdlib.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index dd779bd740..f971df4247 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -932,7 +932,7 @@ extern int wctomb (char *__s, wchar_t __wchar) __THROW; /* Convert a multibyte string to a wide char string. */ extern size_t mbstowcs (wchar_t *__restrict __pwcs, const char *__restrict __s, size_t __n) __THROW - __attr_access ((__write_only__, 1, 3)) __attr_access ((__read_only__, 2)); + __attr_access ((__read_only__, 2)); /* Convert a wide char string to multibyte string. */ extern size_t wcstombs (char *__restrict __s, const wchar_t *__restrict __pwcs, size_t __n) |