This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [MTASCsft PATCH 20/??] MT-, AS- and AC-Safety docs: manual/pattern.texi
- From: "Carlos O'Donell" <carlos at redhat dot com>
- To: Alexandre Oliva <aoliva at redhat dot com>, codonell at redhat dot com
- Cc: libc-alpha at sourceware dot org
- Date: Fri, 31 Jan 2014 04:33:34 -0500
- Subject: Re: [MTASCsft PATCH 20/??] MT-, AS- and AC-Safety docs: manual/pattern.texi
- Authentication-results: sourceware.org; auth=none
- References: <ortxelb5zd dot fsf at livre dot home> <or4n4uoncj dot fsf at livre dot home> <ork3dkhlh2 dot fsf_-_ at livre dot home>
On 01/27/2014 09:46 PM, Alexandre Oliva wrote:
>
> for ChangeLog
>
> * manual/pattern.texi: Document MTASC-safety properties.
OK to checkin.
> ---
> manual/pattern.texi | 727 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 727 insertions(+)
>
> diff --git a/manual/pattern.texi b/manual/pattern.texi
> index afd6480..296aa72 100644
> --- a/manual/pattern.texi
> +++ b/manual/pattern.texi
> @@ -28,6 +28,38 @@ declared in @file{fnmatch.h}.
> @comment fnmatch.h
> @comment POSIX.2
> @deftypefun int fnmatch (const char *@var{pattern}, const char *@var{string}, int @var{flags})
> +@safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
> +@c fnmatch @mtsenv @mtslocale @ascuheap @acsmem
> +@c strnlen dup ok
> +@c mbsrtowcs
> +@c memset dup ok
> +@c malloc dup @ascuheap @acsmem
> +@c mbsinit dup ok
> +@c free dup @ascuheap @acsmem
> +@c FCT = internal_fnwmatch @mtsenv @mtslocale @ascuheap @acsmem
> +@c FOLD @mtslocale
> +@c towlower @mtslocale
> +@c EXT @mtsenv @mtslocale @ascuheap @acsmem
> +@c STRLEN = wcslen dup ok
> +@c getenv @mtsenv
> +@c malloc dup @ascuheap @acsmem
> +@c MEMPCPY = wmempcpy dup ok
> +@c FCT dup @mtsenv @mtslocale @ascuheap @acsmem
> +@c STRCAT = wcscat dup ok
> +@c free dup @ascuheap @acsmem
> +@c END @mtsenv
> +@c getenv @mtsenv
> +@c MEMCHR = wmemchr dup ok
> +@c getenv @mtsenv
> +@c IS_CHAR_CLASS = is_char_class @mtslocale
> +@c wctype @mtslocale
> +@c BTOWC ok
> +@c ISWCTYPE ok
> +@c auto findidx dup ok
> +@c elem_hash dup ok
> +@c memcmp dup ok
> +@c collseq_table_lookup dup ok
> +@c NO_LEADING_PERIOD ok
> This function tests whether the string @var{string} matches the pattern
> @var{pattern}. It returns @code{0} if they do match; otherwise, it
> returns the nonzero value @code{FNM_NOMATCH}. The arguments
> @@ -327,6 +359,63 @@ This is a GNU extension.
> @comment glob.h
> @comment POSIX.2
> @deftypefun int glob (const char *@var{pattern}, int @var{flags}, int (*@var{errfunc}) (const char *@var{filename}, int @var{error-code}), glob_t *@var{vector-ptr})
> +@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtsenv{} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
> +@c glob @mtasurace:utent @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @asucorrupt @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c strlen dup ok
> +@c strchr dup ok
> +@c malloc dup @ascuheap @acsmem
> +@c mempcpy dup ok
> +@c next_brace_sub ok
> +@c free dup @ascuheap @acsmem
> +@c globfree dup @asucorrupt @ascuheap @acucorrupt @acsmem
> +@c glob_pattern_p ok
> +@c glob_pattern_type dup ok
> +@c getenv dup @mtsenv
> +@c GET_LOGIN_NAME_MAX ok
> +@c getlogin_r dup @mtasurace:utent @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c GETPW_R_SIZE_MAX ok
> +@c getpwnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c realloc dup @ascuheap @acsmem
> +@c memcpy dup ok
> +@c memchr dup ok
> +@c *pglob->gl_stat user-supplied
> +@c stat64 dup ok
> +@c S_ISDIR dup ok
> +@c strdup dup @ascuheap @acsmem
> +@c glob_pattern_type ok
> +@c glob_in_dir @mtsenv @mtslocale @asucorrupt @ascuheap @acucorrupt @acsfd @acsmem
> +@c strlen dup ok
> +@c glob_pattern_type dup ok
> +@c malloc dup @ascuheap @acsmem
> +@c mempcpy dup ok
> +@c *pglob->gl_stat user-supplied
> +@c stat64 dup ok
> +@c free dup @ascuheap @acsmem
> +@c *pglob->gl_opendir user-supplied
> +@c opendir dup @ascuheap @acsmem @acsfd
> +@c dirfd dup ok
> +@c *pglob->gl_readdir user-supplied
> +@c CONVERT_DIRENT_DIRENT64 ok
> +@c readdir64 ok [protected by exclusive use of the stream]
> +@c REAL_DIR_ENTRY ok
> +@c DIRENT_MIGHT_BE_DIR ok
> +@c fnmatch dup @mtsenv @mtslocale @ascuheap @acsmem
> +@c DIRENT_MIGHT_BE_SYMLINK ok
> +@c link_exists_p ok
> +@c link_exists2_p ok
> +@c strlen dup ok
> +@c mempcpy dup ok
> +@c *pglob->gl_stat user-supplied
> +@c fxstatat64 dup ok
> +@c realloc dup @ascuheap @acsmem
> +@c pglob->gl_closedir user-supplied
> +@c closedir @ascuheap @acsmem @acsfd
> +@c prefix_array dup @asucorrupt @ascuheap @acucorrupt @acsmem
> +@c strlen dup ok
> +@c malloc dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c mempcpy dup ok
> +@c strcpy dup ok
> The function @code{glob} does globbing using the pattern @var{pattern}
> in the current directory. It puts the result in a newly allocated
> vector, and stores the size and address of this vector into
> @@ -398,6 +487,8 @@ is encountered @code{glob} @emph{can} fail.
> @comment glob.h
> @comment GNU
> @deftypefun int glob64 (const char *@var{pattern}, int @var{flags}, int (*@var{errfunc}) (const char *@var{filename}, int @var{error-code}), glob64_t *@var{vector-ptr})
> +@safety{@prelim{}@mtunsafe{@mtasurace{} @mtsenv{} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @asucorrupt{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
> +@c Same code as glob, but with glob64_t #defined as glob_t.
> The @code{glob64} function was added as part of the Large File Summit
> extensions but is not part of the original LFS proposal. The reason for
> this is simple: it is not necessary. The necessity for a @code{glob64}
> @@ -662,6 +753,9 @@ the time when all @code{glob} calls are done.
> @comment glob.h
> @comment POSIX.2
> @deftypefun void globfree (glob_t *@var{pglob})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}}
> +@c globfree dup @asucorrupt @ascuheap @acucorrupt @acsmem
> +@c free dup @ascuheap @acsmem
> The @code{globfree} function frees all resources allocated by previous
> calls to @code{glob} associated with the object pointed to by
> @var{pglob}. This function should be called whenever the currently used
> @@ -671,6 +765,7 @@ calls to @code{glob} associated with the object pointed to by
> @comment glob.h
> @comment GNU
> @deftypefun void globfree64 (glob64_t *@var{pglob})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
> This function is equivalent to @code{globfree} but it frees records of
> type @code{glob64_t} which were allocated by @code{glob64}.
> @end deftypefun
> @@ -733,6 +828,250 @@ expression into it by calling @code{regcomp}.
> @comment regex.h
> @comment POSIX.2
> @deftypefun int regcomp (regex_t *restrict @var{compiled}, const char *restrict @var{pattern}, int @var{cflags})
> +@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
> +@c All of the issues have to do with memory allocation and multi-byte
> +@c character handling present in the input string, or implied by ranges
> +@c or inverted character classes.
> +@c (re_)malloc @ascuheap @acsmem
> +@c re_compile_internal @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c (re_)realloc @ascuheap @acsmem [no @asucorrupt @acucorrupt for we zero the buffer]
> +@c init_dfa @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c (re_)malloc @ascuheap @acsmem
> +@c calloc @ascuheap @acsmem
> +@c _NL_CURRENT ok
> +@c _NL_CURRENT_WORD ok
> +@c btowc @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c libc_lock_init ok
> +@c re_string_construct @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_construct_common ok
> +@c re_string_realloc_buffers @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c build_wcs_upper_buffer @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c isascii ok
> +@c mbsinit ok
> +@c toupper ok
> +@c mbrtowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c iswlower @mtslocale
> +@c towupper @mtslocale
> +@c wcrtomb dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c build_upper_buffer ok (@mtslocale but optimized)
> +@c islower ok
> +@c toupper ok
> +@c build_wcs_buffer @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c mbrtowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_translate_buffer ok
> +@c parse @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c fetch_token @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c peek_token @mtslocale
> +@c re_string_eoi ok
> +@c re_string_peek_byte ok
> +@c re_string_cur_idx ok
> +@c re_string_length ok
> +@c re_string_peek_byte_case @mtslocale
> +@c re_string_peek_byte dup ok
> +@c re_string_is_single_byte_char ok
> +@c isascii ok
> +@c re_string_peek_byte dup ok
> +@c re_string_wchar_at ok
> +@c re_string_skip_bytes ok
> +@c re_string_skip_bytes dup ok
> +@c parse_reg_exp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c parse_branch @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c parse_expression @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c create_token_tree dup @ascuheap @acsmem
> +@c re_string_eoi dup ok
> +@c re_string_first_byte ok
> +@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c create_tree dup @ascuheap @acsmem
> +@c parse_sub_exp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c parse_reg_exp dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c postorder() @ascuheap @acsmem
> +@c free_tree @ascuheap @acsmem
> +@c free_token dup @ascuheap @acsmem
> +@c create_tree dup @ascuheap @acsmem
> +@c parse_bracket_exp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c _NL_CURRENT dup ok
> +@c _NL_CURRENT_WORD dup ok
> +@c calloc dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c peek_token_bracket ok
> +@c re_string_eoi dup ok
> +@c re_string_peek_byte dup ok
> +@c re_string_first_byte dup ok
> +@c re_string_cur_idx dup ok
> +@c re_string_length dup ok
> +@c re_string_skip_bytes dup ok
> +@c bitset_set ok
> +@c re_string_skip_bytes ok
> +@c parse_bracket_element @mtslocale
> +@c re_string_char_size_at ok
> +@c re_string_wchar_at dup ok
> +@c re_string_skip_bytes dup ok
> +@c parse_bracket_symbol @mtslocale
> +@c re_string_eoi dup ok
> +@c re_string_fetch_byte_case @mtslocale
> +@c re_string_fetch_byte ok
> +@c re_string_first_byte dup ok
> +@c isascii ok
> +@c re_string_char_size_at dup ok
> +@c re_string_skip_bytes dup ok
> +@c re_string_fetch_byte dup ok
> +@c re_string_peek_byte dup ok
> +@c re_string_skip_bytes dup ok
> +@c peek_token_bracket dup ok
> +@c auto build_range_exp @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c auto lookup_collation_sequence_value @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c btowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c collseq_table_lookup ok
> +@c auto seek_collating_symbol_entry dup ok
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c collseq_table_lookup dup ok
> +@c bitset_set dup ok
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c build_equiv_class @mtslocale @ascuheap @acsmem
> +@c _NL_CURRENT ok
> +@c auto findidx ok
> +@c bitset_set dup ok
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c auto build_collating_symbol @ascuheap @acsmem
> +@c auto seek_collating_symbol_entry ok
> +@c bitset_set dup ok
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c build_charclass @mtslocale @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c bitset_set dup ok
> +@c isalnum ok
> +@c iscntrl ok
> +@c isspace ok
> +@c isalpha ok
> +@c isdigit ok
> +@c isprint ok
> +@c isupper ok
> +@c isblank ok
> +@c isgraph ok
> +@c ispunct ok
> +@c isxdigit ok
> +@c bitset_not ok
> +@c bitset_mask ok
> +@c create_token_tree dup @ascuheap @acsmem
> +@c create_tree dup @ascuheap @acsmem
> +@c free_charset dup @ascuheap @acsmem
> +@c init_word_char @mtslocale
> +@c isalnum ok
> +@c build_charclass_op @mtslocale @ascuheap @acsmem
> +@c calloc dup @ascuheap @acsmem
> +@c build_charclass dup @mtslocale @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c free_charset dup @ascuheap @acsmem
> +@c bitset_set dup ok
> +@c bitset_not dup ok
> +@c bitset_mask dup ok
> +@c create_token_tree dup @ascuheap @acsmem
> +@c create_tree dup @ascuheap @acsmem
> +@c parse_dup_op @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_cur_idx dup ok
> +@c fetch_number @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_set_index ok
> +@c postorder() @ascuheap @acsmem
> +@c free_tree dup @ascuheap @acsmem
> +@c mark_opt_subexp ok
> +@c duplicate_tree @ascuheap @acsmem
> +@c create_token_tree dup @ascuheap @acsmem
> +@c create_tree dup @ascuheap @acsmem
> +@c postorder() @ascuheap @acsmem
> +@c free_tree dup @ascuheap @acsmem
> +@c fetch_token dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c parse_branch dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c create_tree dup @ascuheap @acsmem
> +@c create_tree @ascuheap @acsmem
> +@c create_token_tree @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c analyze @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c preorder() @ascuheap @acsmem
> +@c optimize_subexps ok
> +@c calc_next ok
> +@c link_nfa_nodes @ascuheap @acsmem
> +@c re_node_set_init_1 @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c re_node_set_init_2 @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c postorder() @ascuheap @acsmem
> +@c lower_subexps @ascuheap @acsmem
> +@c lower_subexp @ascuheap @acsmem
> +@c create_tree dup @ascuheap @acsmem
> +@c calc_first @ascuheap @acsmem
> +@c re_dfa_add_node @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c re_node_set_init_empty ok
> +@c calc_eclosure @ascuheap @acsmem
> +@c calc_eclosure_iter @ascuheap @acsmem
> +@c re_node_set_alloc @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c duplicate_node_closure @ascuheap @acsmem
> +@c re_node_set_empty ok
> +@c duplicate_node @ascuheap @acsmem
> +@c re_dfa_add_node dup @ascuheap @acsmem
> +@c re_node_set_insert @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c search_duplicated_node ok
> +@c re_node_set_merge @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c re_node_set_free @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c calc_inveclosure @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c re_node_set_insert_last @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c optimize_utf8 ok
> +@c create_initial_state @ascuheap @acsmem
> +@c re_node_set_init_copy @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c re_node_set_contains ok
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c re_acquire_state_context @ascuheap @acsmem
> +@c calc_state_hash ok
> +@c re_node_set_compare ok
> +@c create_cd_newstate @ascuheap @acsmem
> +@c calloc dup @ascuheap @acsmem
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c free_state @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c NOT_SATISFY_PREV_CONSTRAINT ok
> +@c re_node_set_remove_at ok
> +@c register_state @ascuheap @acsmem
> +@c re_node_set_alloc dup @ascuheap @acsmem
> +@c re_node_set_insert_last dup @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c free_workarea_compile @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c re_string_destruct @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c free_dfa_content @ascuheap @acsmem
> +@c free_token @ascuheap @acsmem
> +@c free_charset @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_compile_fastmap @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_compile_fastmap_iter @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_set_fastmap ok
> +@c tolower ok
> +@c mbrtowc dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c wcrtomb dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c towlower @mtslocale
> +@c _NL_CURRENT ok
> +@c (re_)free @ascuheap @acsmem
> The function @code{regcomp} ``compiles'' a regular expression into a
> data structure that you can use with @code{regexec} to match against a
> string. The compiled regular expression format is designed for
> @@ -882,6 +1221,247 @@ unless the regular expression contains anchor characters (@samp{^} or
> @comment regex.h
> @comment POSIX.2
> @deftypefun int regexec (const regex_t *restrict @var{compiled}, const char *restrict @var{string}, size_t @var{nmatch}, regmatch_t @var{matchptr}[restrict], int @var{eflags})
> +@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
> +@c libc_lock_lock @asulock @aculock
> +@c re_search_internal @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_allocate @ascuheap @acsmem
> +@c re_string_construct_common dup ok
> +@c re_string_realloc_buffers dup @ascuheap @acsmem
> +@c match_ctx_init @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c re_string_byte_at ok
> +@c re_string_first_byte dup ok
> +@c check_matching @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_cur_idx dup ok
> +@c acquire_init_state_context dup @ascuheap @acsmem
> +@c re_string_context_at ok
> +@c re_string_byte_at dup ok
> +@c bitset_contain ok
> +@c re_acquire_state_context dup @ascuheap @acsmem
> +@c check_subexp_matching_top @ascuheap @acsmem
> +@c match_ctx_add_subtop @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c calloc dup @ascuheap @acsmem
> +@c transit_state_bkref @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_cur_idx dup ok
> +@c re_string_context_at dup ok
> +@c NOT_SATISFY_NEXT_CONSTRAINT ok
> +@c get_subexp @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_get_buffer ok
> +@c search_cur_bkref_entry ok
> +@c clean_state_log_if_needed @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c extend_buffers @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_realloc_buffers dup @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c build_wcs_upper_buffer dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c build_upper_buffer dup ok (@mtslocale but optimized)
> +@c build_wcs_buffer dup @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_translate_buffer dup ok
> +@c get_subexp_sub @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c check_arrival @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c re_string_context_at dup ok
> +@c re_node_set_init_1 dup @ascuheap @acsmem
> +@c check_arrival_expand_ecl @ascuheap @acsmem
> +@c re_node_set_alloc dup @ascuheap @acsmem
> +@c find_subexp_node ok
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c check_arrival_expand_ecl_sub @ascuheap @acsmem
> +@c re_node_set_contains dup ok
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c expand_bkref_cache @ascuheap @acsmem
> +@c search_cur_bkref_entry dup ok
> +@c re_node_set_contains dup ok
> +@c re_node_set_init_1 dup @ascuheap @acsmem
> +@c check_arrival_expand_ecl dup @ascuheap @acsmem
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_acquire_state @ascuheap @acsmem
> +@c calc_state_hash dup ok
> +@c re_node_set_compare dup ok
> +@c create_ci_newstate @ascuheap @acsmem
> +@c calloc dup @ascuheap @acsmem
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c register_state dup @ascuheap @acsmem
> +@c free_state dup @ascuheap @acsmem
> +@c re_acquire_state_context dup @ascuheap @acsmem
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c check_arrival_add_next_nodes @mtslocale @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c check_node_accept_bytes @mtslocale @ascuheap @acsmem
> +@c re_string_byte_at dup ok
> +@c re_string_char_size_at dup ok
> +@c re_string_elem_size_at @mtslocale
> +@c _NL_CURRENT_WORD dup ok
> +@c _NL_CURRENT dup ok
> +@c auto findidx dup ok
> +@c _NL_CURRENT_WORD dup ok
> +@c _NL_CURRENT dup ok
> +@c collseq_table_lookup dup ok
> +@c find_collation_sequence_value @mtslocale
> +@c _NL_CURRENT_WORD dup ok
> +@c _NL_CURRENT dup ok
> +@c auto findidx dup ok
> +@c wcscoll @mtslocale @ascuheap @acsmem
> +@c re_node_set_empty dup ok
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c re_acquire_state dup @ascuheap @acsmem
> +@c check_node_accept ok
> +@c re_string_byte_at dup ok
> +@c bitset_contain dup ok
> +@c re_string_context_at dup ok
> +@c NOT_SATISFY_NEXT_CONSTRAINT dup ok
> +@c match_ctx_add_entry @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c clean_state_log_if_needed dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c extend_buffers dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c find_subexp_node dup ok
> +@c calloc dup @ascuheap @acsmem
> +@c check_arrival dup ***
> +@c match_ctx_add_sublast @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c re_acquire_state_context dup @ascuheap @acsmem
> +@c re_node_set_init_union @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c check_subexp_matching_top dup @ascuheap @acsmem
> +@c check_halt_state_context ok
> +@c re_string_context_at dup ok
> +@c check_halt_node_context ok
> +@c NOT_SATISFY_NEXT_CONSTRAINT dup ok
> +@c re_string_eoi dup ok
> +@c extend_buffers dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c transit_state @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c transit_state_mb @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_context_at dup ok
> +@c NOT_SATISFY_NEXT_CONSTRAINT dup ok
> +@c check_node_accept_bytes dup @mtslocale @ascuheap @acsmem
> +@c re_string_cur_idx dup ok
> +@c clean_state_log_if_needed @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_node_set_init_union dup @ascuheap @acsmem
> +@c re_acquire_state_context dup @ascuheap @acsmem
> +@c re_string_fetch_byte dup ok
> +@c re_string_context_at dup ok
> +@c build_trtable @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c group_nodes_into_DFAstates @ascuheap @acsmem
> +@c bitset_empty dup ok
> +@c bitset_set dup ok
> +@c bitset_merge dup ok
> +@c bitset_set_all ok
> +@c bitset_clear ok
> +@c bitset_contain dup ok
> +@c bitset_copy ok
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c re_node_set_init_1 dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_node_set_alloc dup @ascuheap @acsmem
> +@c malloc dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c bitset_empty ok
> +@c re_node_set_empty dup ok
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c re_acquire_state_context dup @ascuheap @acsmem
> +@c bitset_merge ok
> +@c calloc dup @ascuheap @acsmem
> +@c bitset_contain dup ok
> +@c merge_state_with_log @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c re_string_cur_idx dup ok
> +@c re_node_set_init_union dup @ascuheap @acsmem
> +@c re_string_context_at dup ok
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c check_subexp_matching_top @ascuheap @acsmem
> +@c match_ctx_add_subtop dup @ascuheap @acsmem
> +@c transit_state_bkref dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c find_recover_state
> +@c re_string_cur_idx dup ok
> +@c re_string_skip_bytes dup ok
> +@c merge_state_with_log dup @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
> +@c check_halt_state_context dup ok
> +@c prune_impossible_nodes @mtslocale @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c sift_ctx_init ok
> +@c re_node_set_init_empty dup ok
> +@c sift_states_backward @mtslocale @ascuheap @acsmem
> +@c re_node_set_init_1 dup @ascuheap @acsmem
> +@c update_cur_sifted_state @mtslocale @ascuheap @acsmem
> +@c add_epsilon_src_nodes @ascuheap @acsmem
> +@c re_acquire_state dup @ascuheap @acsmem
> +@c re_node_set_alloc dup @ascuheap @acsmem
> +@c re_node_set_merge dup @ascuheap @acsmem
> +@c re_node_set_add_intersect @ascuheap @acsmem
> +@c (re_)realloc dup @ascuheap @acsmem
> +@c check_subexp_limits @ascuheap @acsmem
> +@c sub_epsilon_src_nodes @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c re_node_set_contains dup ok
> +@c re_node_set_add_intersect dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_node_set_remove_at dup ok
> +@c re_node_set_contains dup ok
> +@c re_acquire_state dup @ascuheap @acsmem
> +@c sift_states_bkref @mtslocale @ascuheap @acsmem
> +@c search_cur_bkref_entry dup ok
> +@c check_dst_limits ok
> +@c search_cur_bkref_entry dup ok
> +@c check_dst_limits_calc_pos ok
> +@c check_dst_limits_calc_pos_1 ok
> +@c re_node_set_init_copy dup @ascuheap @acsmem
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c sift_states_backward dup @mtslocale @ascuheap @acsmem
> +@c merge_state_array dup @ascuheap @acsmem
> +@c re_node_set_remove ok
> +@c re_node_set_contains dup ok
> +@c re_node_set_remove_at dup ok
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c re_node_set_empty dup ok
> +@c build_sifted_states @mtslocale @ascuheap @acsmem
> +@c sift_states_iter_mb @mtslocale @ascuheap @acsmem
> +@c check_node_accept_bytes dup @mtslocale @ascuheap @acsmem
> +@c check_node_accept dup ok
> +@c check_dst_limits dup ok
> +@c re_node_set_insert dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c check_halt_state_context dup ok
> +@c merge_state_array @ascuheap @acsmem
> +@c re_node_set_init_union dup @ascuheap @acsmem
> +@c re_acquire_state dup @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c set_regs @ascuheap @acsmem
> +@c (re_)malloc dup @ascuheap @acsmem
> +@c re_node_set_init_empty dup ok
> +@c free_fail_stack_return @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c update_regs ok
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c pop_fail_stack @ascuheap @acsmem
> +@c re_node_set_free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c match_ctx_free @ascuheap @acsmem
> +@c match_ctx_clean @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c (re_)free dup @ascuheap @acsmem
> +@c re_string_destruct dup @ascuheap @acsmem
> +@c libc_lock_unlock @aculock
> This function tries to match the compiled regular expression
> @code{*@var{compiled}} against @var{string}.
>
> @@ -1044,6 +1624,9 @@ free the storage it uses by calling @code{regfree}.
> @comment regex.h
> @comment POSIX.2
> @deftypefun void regfree (regex_t *@var{compiled})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
> +@c (re_)free dup @ascuheap @acsmem
> +@c free_dfa_content dup @ascuheap @acsmem
> Calling @code{regfree} frees all the storage that @code{*@var{compiled}}
> points to. This includes various internal fields of the @code{regex_t}
> structure that aren't documented in this manual.
> @@ -1061,6 +1644,8 @@ the function @code{regerror} to turn it into an error message string.
> @comment regex.h
> @comment POSIX.2
> @deftypefun size_t regerror (int @var{errcode}, const regex_t *restrict @var{compiled}, char *restrict @var{buffer}, size_t @var{length})
> +@safety{@prelim{}@mtsafe{@mtsenv{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
> +@c regerror calls gettext, strcmp and mempcpy or memcpy.
> This function produces an error message string for the error code
> @var{errcode}, and stores the string in @var{length} bytes of memory
> starting at @var{buffer}. For the @var{compiled} argument, supply the
> @@ -1226,6 +1811,145 @@ the beginning of the vector.
> @comment wordexp.h
> @comment POSIX.2
> @deftypefun int wordexp (const char *@var{words}, wordexp_t *@var{word-vector-ptr}, int @var{flags})
> +@safety{@prelim{}@mtunsafe{@mtasurace{:utent} @mtasuconst{:@mtsenv{}} @mtsenv{} @mtascusig{:ALRM} @mtascutimer{} @mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuintl{} @ascuheap{} @asucorrupt{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}}
> +@c wordexp @mtasurace:utent @mtasuconst:@mtsenv @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuintl @ascuheap @asucorrupt @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c w_newword ok
> +@c wordfree dup @asucorrupt @ascuheap @acucorrupt @acsmem
> +@c calloc dup @ascuheap @acsmem
> +@c getenv dup @mtsenv
> +@c strcpy dup ok
> +@c parse_backslash @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c parse_dollars @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c parse_arith @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c w_newword dup ok
> +@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c parse_backtick dup @ascuplugin @ascuheap @aculock @acsfd @acsmem
> +@c parse_qtd_backslash dup @ascuheap @acsmem
> +@c eval_expr @mtslocale
> +@c eval_expr_multidiv @mtslocale
> +@c eval_expr_val @mtslocale
> +@c isspace dup @mtslocale
> +@c eval_expr dup @mtslocale
> +@c isspace dup @mtslocale
> +@c isspace dup @mtslocale
> +@c free dup @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c w_addstr dup @ascuheap @acsmem
> +@c itoa_word dup ok
> +@c parse_comm @ascuplugin @ascuheap @aculock @acsfd @acsmem
> +@c w_newword dup ok
> +@c pthread_setcancelstate @ascuplugin @ascuheap @acsmem
> +@c (disable cancellation around exec_comm; it may do_cancel the
> +@c second time, if async cancel is enabled)
> +@c THREAD_ATOMIC_CMPXCHG_VAL dup ok
> +@c CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS dup ok
> +@c do_cancel @ascuplugin @ascuheap @acsmem
> +@c THREAD_ATOMIC_BIT_SET dup ok
> +@c pthread_unwind @ascuplugin @ascuheap @acsmem
> +@c Unwind_ForcedUnwind if available @ascuplugin @ascuheap @acsmem
> +@c libc_unwind_longjmp otherwise
> +@c cleanups
> +@c exec_comm @ascuplugin @ascuheap @aculock @acsfd @acsmem
> +@c pipe2 dup ok
> +@c pipe dup ok
> +@c fork dup @ascuplugin @aculock
> +@c close dup @acsfd
> +@c on child: exec_comm_child -> exec or abort
> +@c waitpid dup ok
> +@c read dup ok
> +@c w_addmem dup @ascuheap @acsmem
> +@c strchr dup ok
> +@c w_addword dup @ascuheap @acsmem
> +@c w_newword dup ok
> +@c w_addchar dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c kill dup ok
> +@c free dup @ascuheap @acsmem
> +@c parse_param @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c reads from __libc_argc and __libc_argv without guards
> +@c w_newword dup ok
> +@c isalpha dup @mtslocale^^
> +@c w_addchar dup @ascuheap @acsmem
> +@c isalnum dup @mtslocale^^
> +@c isdigit dup @mtslocale^^
> +@c strchr dup ok
> +@c itoa_word dup ok
> +@c atoi dup @mtslocale
> +@c getpid dup ok
> +@c w_addstr dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c strlen dup ok
> +@c malloc dup @ascuheap @acsmem
> +@c stpcpy dup ok
> +@c w_addword dup @ascuheap @acsmem
> +@c strdup dup @ascuheap @acsmem
> +@c getenv dup @mtsenv
> +@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c parse_tilde dup @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c fnmatch dup @mtsenv @mtslocale @ascuheap @acsmem
> +@c mempcpy dup ok
> +@c _ dup @ascuintl
> +@c fxprintf dup @aculock
> +@c setenv dup @mtasuconst:@mtsenv @ascuheap @asulock @acucorrupt @aculock @acsmem
> +@c strspn dup ok
> +@c strcspn dup ok
> +@c parse_backtick @ascuplugin @ascuheap @aculock @acsfd @acsmem
> +@c w_newword dup ok
> +@c exec_comm dup @ascuplugin @ascuheap @aculock @acsfd @acsmem
> +@c free dup @ascuheap @acsmem
> +@c parse_qtd_backslash dup @ascuheap @acsmem
> +@c parse_backslash dup @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c parse_dquote @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c parse_backtick dup @ascuplugin @ascuheap @aculock @acsfd @acsmem
> +@c parse_qtd_backslash dup @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c w_addword dup @ascuheap @acsmem
> +@c strdup dup @ascuheap @acsmem
> +@c realloc dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c parse_squote dup @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c parse_tilde @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c strchr dup ok
> +@c w_addchar dup @ascuheap @acsmem
> +@c getenv dup @mtsenv
> +@c w_addstr dup @ascuheap @acsmem
> +@c strlen dup ok
> +@c w_addmem dup @ascuheap @acsmem
> +@c realloc dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c mempcpy dup ok
> +@c getuid dup ok
> +@c getpwuid_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c getpwnam_r dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c parse_glob @mtasurace:utent @mtasuconst:@mtsenv @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c strchr dup ok
> +@c parse_dollars dup @mtasuconst:@mtsenv @mtslocale @mtsenv @ascudlopen @ascuplugin @ascuintl @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem
> +@c parse_qtd_backslash @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c parse_backslash dup @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c w_addword dup @ascuheap @acsmem
> +@c w_newword dup ok
> +@c do_parse_glob @mtasurace:utent @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @aculock @acsfd @acsmem
> +@c glob dup @mtasurace:utent @mtsenv @mtascusig:ALRM @mtascutimer @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @aculock @acsfd @acsmem [auto glob_t avoids @asucorrupt @acucorrupt]
> +@c w_addstr dup @ascuheap @acsmem
> +@c w_addchar dup @ascuheap @acsmem
> +@c globfree dup @ascuheap @acsmem [auto glob_t avoids @asucorrupt @acucorrupt]
> +@c free dup @ascuheap @acsmem
> +@c w_newword dup ok
> +@c strdup dup @ascuheap @acsmem
> +@c w_addword dup @ascuheap @acsmem
> +@c wordfree dup @asucorrupt @ascuheap @acucorrupt @acsmem
> +@c strchr dup ok
> +@c w_addchar dup @ascuheap @acsmem
> +@c realloc dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> +@c free dup @ascuheap @acsmem
> Perform word expansion on the string @var{words}, putting the result in
> a newly allocated vector, and store the size and address of this vector
> into @code{*@var{word-vector-ptr}}. The argument @var{flags} is a
> @@ -1289,6 +2013,9 @@ quoting character is a syntax error.
> @comment wordexp.h
> @comment POSIX.2
> @deftypefun void wordfree (wordexp_t *@var{word-vector-ptr})
> +@safety{@prelim{}@mtsafe{}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @acsmem{}}}
> +@c wordfree dup @asucorrupt @ascuheap @acucorrupt @acsmem
> +@c free dup @ascuheap @acsmem
> Free the storage used for the word-strings and vector that
> @code{*@var{word-vector-ptr}} points to. This does not free the
> structure @code{*@var{word-vector-ptr}} itself---only the other
>