Hi Stefan, On 7/12/21 11:07 AM, Stefan Kanthak wrote:
Hi, the examples section of wcstok(3) shows the following code which exhibits undefined behaviour and typically segfaults: <https://man7.org/linux/man-pages/man3/wcstok.3.html#EXAMPLES> | wchar_t *wcs = ...; | wchar_t *token; | wchar_t *state; | for (token = wcstok(wcs, " \t\n", &state); | token != NULL; | token = wcstok(NULL, " \t\n", &state)) { | ... | } The string literal pointed to by wcs is read-only, and an attempt to modify a string literal results in undefined behaviour; wcstok() but writes NULs into its input string. FIX: replace the first line with either | wchar_t *wcs = strdup(...); or | wchar_t wcs[] = ...;
That code is a bit unfortunate. It is not a complete program, so it can be interpreted in different ways, one of them the one you said, which results in UB.
I guess the intent of the code was that wcs was assigned a pointer to a wchar_t * (not a literal), and therefore, it would be correct. The code predates version control, so we'll never know...
Would you mind sending a complete example? Thanks, Alex
regards Stefan
-- Alejandro Colomar Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/ http://www.alejandro-colomar.es/