From 32c7acd46401530fdbd4e98508c9baaa705f8b53 Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra Date: Fri, 3 Feb 2023 12:01:33 +0000 Subject: Replace rawmemchr (s, '\0') with strchr Almost all uses of rawmemchr find the end of a string. Since most targets use a generic implementation, replacing it with strchr is better since that is optimized by compilers into strlen (s) + s. Also fix the generic rawmemchr implementation to use a cast to unsigned char in the if statement. Reviewed-by: Adhemerval Zanella --- benchtests/bench-rawmemchr.c | 2 +- benchtests/bench-strtok.c | 2 +- elf/dl-support.c | 2 +- elf/ldconfig.c | 2 +- elf/rtld.c | 5 ++--- iconv/gconv_conf.c | 4 ++-- iconvdata/iso646.c | 2 +- iconvdata/utf-7.c | 2 +- inet/getnetgrent_r.c | 6 +++--- intl/dcigettext.c | 4 ---- io/ftw.c | 2 +- libio/strops.c | 2 +- manual/string.texi | 10 +--------- nis/nis_addmember.c | 2 +- nis/nis_call.c | 4 ++-- nis/nis_local_names.c | 4 ++-- nis/nis_removemember.c | 2 +- nscd/connections.c | 2 +- nscd/grpcache.c | 2 +- nscd/netgroupcache.c | 12 ++++++------ nscd/pwdcache.c | 2 +- nss/nss_db/db-XXX.c | 2 +- stdlib/canonicalize.c | 3 +-- string/rawmemchr.c | 2 +- 24 files changed, 34 insertions(+), 48 deletions(-) diff --git a/benchtests/bench-rawmemchr.c b/benchtests/bench-rawmemchr.c index f6398f86d9..088c516e59 100644 --- a/benchtests/bench-rawmemchr.c +++ b/benchtests/bench-rawmemchr.c @@ -30,7 +30,7 @@ typedef char *(*proto_t) (const char *, int); char * generic_rawmemchr (const char *s, int c) { - if (c != 0) + if ((unsigned char) c != 0) return memchr (s, c, PTRDIFF_MAX); return (char *)s + strlen (s); } diff --git a/benchtests/bench-strtok.c b/benchtests/bench-strtok.c index 10260e9b47..711bdaab58 100644 --- a/benchtests/bench-strtok.c +++ b/benchtests/bench-strtok.c @@ -42,7 +42,7 @@ oldstrtok (char *s, const char *delim) s = strpbrk (token, delim); if (s == NULL) /* This token finishes the string. */ - olds = rawmemchr (token, '\0'); + olds = strchr (token, '\0'); else { /* Terminate the token and make OLDS point past it. */ diff --git a/elf/dl-support.c b/elf/dl-support.c index 9714f75db0..d2519ce1a9 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -326,7 +326,7 @@ _dl_non_dynamic_init (void) while (cp < unsecure_envvars + sizeof (unsecure_envvars)) { __unsetenv (cp); - cp = (const char *) __rawmemchr (cp, '\0') + 1; + cp = strchr (cp, '\0') + 1; } #if !HAVE_TUNABLES diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 166dccb528..3f1b30c570 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -1201,7 +1201,7 @@ main (int argc, char **argv) if (opt_chroot != NULL) { /* Normalize the path a bit, we might need it for printing later. */ - char *endp = rawmemchr (opt_chroot, '\0'); + char *endp = strchr (opt_chroot, '\0'); while (endp > opt_chroot && endp[-1] == '/') --endp; *endp = '\0'; diff --git a/elf/rtld.c b/elf/rtld.c index b8467f37cf..f82fbeb132 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1024,7 +1024,7 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d); newp->fptr[cnt] = NULL; ++cnt; - cp = rawmemchr (cp, '\0') + 1; + cp = strchr (cp, '\0') + 1; } while (*cp != '\0'); assert (cnt == naudit_ifaces); @@ -2690,8 +2690,7 @@ process_envvars (struct dl_main_state *state) do { unsetenv (nextp); - /* We could use rawmemchr but this need not be fast. */ - nextp = (char *) (strchr) (nextp, '\0') + 1; + nextp = strchr (nextp, '\0') + 1; } while (*nextp != '\0'); diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c index 21165a558a..a75ac13e3f 100644 --- a/iconv/gconv_conf.c +++ b/iconv/gconv_conf.c @@ -502,8 +502,8 @@ __gconv_read_conf (void) do { const char *from = cp; - const char *to = __rawmemchr (from, '\0') + 1; - cp = __rawmemchr (to, '\0') + 1; + const char *to = strchr (from, '\0') + 1; + cp = strchr (to, '\0') + 1; add_alias2 (from, to, cp); } diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c index e044ed2cba..f7111a3759 100644 --- a/iconvdata/iso646.c +++ b/iconvdata/iso646.c @@ -133,7 +133,7 @@ gconv_init (struct __gconv_step *step) enum variant var = 0; for (const char *name = names; *name != '\0'; - name = __rawmemchr (name, '\0') + 1) + name = strchr (name, '\0') + 1) { if (__strcasecmp (step->__from_name, name) == 0) { diff --git a/iconvdata/utf-7.c b/iconvdata/utf-7.c index 198ba99c2b..babeb56f4e 100644 --- a/iconvdata/utf-7.c +++ b/iconvdata/utf-7.c @@ -189,7 +189,7 @@ gconv_init (struct __gconv_step *step) enum variant var = 0; for (const char *name = names; *name != '\0'; - name = __rawmemchr (name, '\0') + 1) + name = strchr (name, '\0') + 1) { if (__strcasecmp (step->__from_name, name) == 0) { diff --git a/inet/getnetgrent_r.c b/inet/getnetgrent_r.c index 833fe21b91..60f476b661 100644 --- a/inet/getnetgrent_r.c +++ b/inet/getnetgrent_r.c @@ -217,11 +217,11 @@ nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen, datap->type = triple_val; datap->val.triple.host = get_nonempty_val (datap->cursor); - datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1; + datap->cursor = strchr (datap->cursor, '\0') + 1; datap->val.triple.user = get_nonempty_val (datap->cursor); - datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1; + datap->cursor = strchr (datap->cursor, '\0') + 1; datap->val.triple.domain = get_nonempty_val (datap->cursor); - datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1; + datap->cursor = strchr (datap->cursor, '\0') + 1; return NSS_STATUS_SUCCESS; } diff --git a/intl/dcigettext.c b/intl/dcigettext.c index d0c62eec7a..64de9d511a 100644 --- a/intl/dcigettext.c +++ b/intl/dcigettext.c @@ -1420,11 +1420,7 @@ plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, p = translation; while (index-- > 0) { -#ifdef _LIBC - p = __rawmemchr (p, '\0'); -#else p = strchr (p, '\0'); -#endif /* And skip over the NUL byte. */ p++; diff --git a/io/ftw.c b/io/ftw.c index 4d49fc7b10..a72c7d5171 100644 --- a/io/ftw.c +++ b/io/ftw.c @@ -535,7 +535,7 @@ fail: /* Next, update the `struct FTW' information. */ ++data->ftw.level; - startp = __rawmemchr (data->dirbuf, '\0'); + startp = strchr (data->dirbuf, '\0'); /* There always must be a directory name. */ assert (startp != data->dirbuf); if (startp[-1] != '/') diff --git a/libio/strops.c b/libio/strops.c index 7e523ad710..b5c850b626 100644 --- a/libio/strops.c +++ b/libio/strops.c @@ -38,7 +38,7 @@ _IO_str_init_static_internal (_IO_strfile *sf, char *ptr, size_t size, char *end; if (size == 0) - end = __rawmemchr (ptr, '\0'); + end = strchr (ptr, '\0'); else if ((size_t) ptr + size > (size_t) ptr) end = ptr + size; else diff --git a/manual/string.texi b/manual/string.texi index 7578aa1c26..e06433187e 100644 --- a/manual/string.texi +++ b/manual/string.texi @@ -1726,15 +1726,7 @@ made an error in assuming that the byte @var{c} is present in the block. In this case the result is unspecified. Otherwise the return value is a pointer to the located byte. -This function is of special interest when looking for the end of a -string. Since all strings are terminated by a null byte a call like - -@smallexample - rawmemchr (str, '\0') -@end smallexample - -@noindent -will never go beyond the end of the string. +When looking for the end of a string, use @code{strchr}. This function is a GNU extension. @end deftypefun diff --git a/nis/nis_addmember.c b/nis/nis_addmember.c index f7d7f16607..89e7affee1 100644 --- a/nis/nis_addmember.c +++ b/nis/nis_addmember.c @@ -32,7 +32,7 @@ nis_addmember (const_nis_name member, const_nis_name group) nis_error status; char *cp, *cp2; - cp = rawmemchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0'); + cp = strchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0'); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); if (cp2 != NULL && cp2[0] != '\0') diff --git a/nis/nis_call.c b/nis/nis_call.c index ec19b21c53..75f2129c76 100644 --- a/nis/nis_call.c +++ b/nis/nis_call.c @@ -483,7 +483,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) } while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME); - cp = rawmemchr (leaf, '\0'); + cp = strchr (leaf, '\0'); *cp++ = '.'; strcpy (cp, domain); @@ -614,7 +614,7 @@ nis_server_cache_search (const_nis_name name, int search_parent, if (ret == NULL) break; - addr = rawmemchr (nis_server_cache[i]->name, '\0') + 8; + addr = strchr (nis_server_cache[i]->name, '\0') + 8; addr = (char *) ((uintptr_t) addr & ~(uintptr_t) 7); xdrmem_create (&xdrs, addr, nis_server_cache[i]->size, XDR_DECODE); if (!_xdr_directory_obj (&xdrs, ret)) diff --git a/nis/nis_local_names.c b/nis/nis_local_names.c index 8fbe9ed80a..e685255300 100644 --- a/nis/nis_local_names.c +++ b/nis/nis_local_names.c @@ -63,7 +63,7 @@ nis_local_directory (void) __nisdomainname[0] = '\0'; else { - char *cp = rawmemchr (__nisdomainname, '\0'); + char *cp = strchr (__nisdomainname, '\0'); /* Missing trailing dot? */ if (cp[-1] != '.') @@ -154,7 +154,7 @@ nis_local_host (void) __nishostname[0] = '\0'; else { - char *cp = rawmemchr (__nishostname, '\0'); + char *cp = strchr (__nishostname, '\0'); int len = cp - __nishostname; /* Hostname already fully qualified? */ diff --git a/nis/nis_removemember.c b/nis/nis_removemember.c index 77702db30c..fbf9703b12 100644 --- a/nis/nis_removemember.c +++ b/nis/nis_removemember.c @@ -32,7 +32,7 @@ nis_removemember (const_nis_name member, const_nis_name group) nis_error status; char *cp, *cp2; - cp = rawmemchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0'); + cp = strchr (nis_leaf_of_r (group, buf, sizeof (buf) - 1), '\0'); cp = stpcpy (cp, ".groups_dir"); cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1); if (cp2 != NULL && cp2[0] != '\0') diff --git a/nscd/connections.c b/nscd/connections.c index b5fbb1a698..b1231a96db 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -1359,7 +1359,7 @@ cannot open /proc/self/cmdline: %m; disabling paranoia mode")); for (char *cp = cmdline; cp < cmdline + readlen;) { argv[argc++] = cp; - cp = (char *) rawmemchr (cp, '\0') + 1; + cp = strchr (cp, '\0') + 1; } argv[argc] = NULL; diff --git a/nscd/grpcache.c b/nscd/grpcache.c index eb20c4f1ab..cdd1071970 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -259,7 +259,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, /* Finally the stringified GID value. */ memcpy (cp, buf, n); char *key_copy = cp + key_offset; - assert (key_copy == (char *) rawmemchr (cp, '\0') + 1); + assert (key_copy == strchr (cp, '\0') + 1); assert (cp == dataset->strdata + total - offsetof (struct dataset, strdata)); diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c index 439dd4ba38..06b7d7b6ca 100644 --- a/nscd/netgroupcache.c +++ b/nscd/netgroupcache.c @@ -453,14 +453,14 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, struct datahead *dh) { const char *group = key; - key = (char *) rawmemchr (key, '\0') + 1; + key = strchr (key, '\0') + 1; size_t group_len = key - group; const char *host = *key++ ? key : NULL; if (host != NULL) - key = (char *) rawmemchr (key, '\0') + 1; + key = strchr (key, '\0') + 1; const char *user = *key++ ? key : NULL; if (user != NULL) - key = (char *) rawmemchr (key, '\0') + 1; + key = strchr (key, '\0') + 1; const char *domain = *key++ ? key : NULL; if (__glibc_unlikely (debug_level > 0)) @@ -538,11 +538,11 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, match anything is stored in the netgroup cache. */ if (host != NULL && *triplets != '\0') success = strcmp (host, triplets) == 0; - triplets = (const char *) rawmemchr (triplets, '\0') + 1; + triplets = strchr (triplets, '\0') + 1; if (success && user != NULL && *triplets != '\0') success = strcmp (user, triplets) == 0; - triplets = (const char *) rawmemchr (triplets, '\0') + 1; + triplets = strchr (triplets, '\0') + 1; if (success && (domain == NULL || *triplets == '\0' || strcmp (domain, triplets) == 0)) @@ -550,7 +550,7 @@ addinnetgrX (struct database_dyn *db, int fd, request_header *req, dataset->resp.result = 1; break; } - triplets = (const char *) rawmemchr (triplets, '\0') + 1; + triplets = strchr (triplets, '\0') + 1; } } diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index f546bb386f..e1b579de6b 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -243,7 +243,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, /* Finally the stringified UID value. */ memcpy (cp, buf, n); char *key_copy = cp + key_offset; - assert (key_copy == (char *) rawmemchr (cp, '\0') + 1); + assert (key_copy == strchr (cp, '\0') + 1); assert (cp == dataset->strdata + total - offsetof (struct dataset, strdata)); diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c index a81bd7466b..0ce730db5a 100644 --- a/nss/nss_db/db-XXX.c +++ b/nss/nss_db/db-XXX.c @@ -269,7 +269,7 @@ CONCAT(_nss_db_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, + state.header->valstrlen); while (entidx < end) { - const char *next = rawmemchr (entidx, '\0') + 1; + const char *next = strchr (entidx, '\0') + 1; size_t len = next - entidx; if (len > buflen) diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c index 78beeef063..7e421ef115 100644 --- a/stdlib/canonicalize.c +++ b/stdlib/canonicalize.c @@ -74,7 +74,6 @@ # endif # define __mempcpy mempcpy # define __pathconf pathconf -# define __rawmemchr rawmemchr # define __readlink readlink # define __stat stat #endif @@ -232,7 +231,7 @@ realpath_stk (const char *name, char *resolved, struct realpath_bufs *bufs) return NULL; rname = bufs->rname.data; } - dest = __rawmemchr (rname, '\0'); + dest = strchr (rname, '\0'); start = name; prefix_len = FILE_SYSTEM_PREFIX_LEN (rname); } diff --git a/string/rawmemchr.c b/string/rawmemchr.c index b44ad79859..aa8f8f2336 100644 --- a/string/rawmemchr.c +++ b/string/rawmemchr.c @@ -39,7 +39,7 @@ DIAG_IGNORE_NEEDS_COMMENT (11, "-Wstringop-overread"); void * RAWMEMCHR (const void *s, int c) { - if (c != '\0') + if ((unsigned char) c != '\0') return memchr (s, c, (size_t)-1); return (char *)s + strlen (s); } -- cgit v1.2.3