public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] Replace rawmemchr (s, '\0') with strchr
@ 2023-02-06 16:28 Wilco Dijkstra
  0 siblings, 0 replies; only message in thread
From: Wilco Dijkstra @ 2023-02-06 16:28 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=32c7acd46401530fdbd4e98508c9baaa705f8b53

commit 32c7acd46401530fdbd4e98508c9baaa705f8b53
Author: Wilco Dijkstra <wilco.dijkstra@arm.com>
Date:   Fri Feb 3 12:01:33 2023 +0000

    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  <adhemerval.zanella@linaro.org>

Diff:
---
 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);
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-06 16:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-06 16:28 [glibc] Replace rawmemchr (s, '\0') with strchr Wilco Dijkstra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).