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>
This commit is contained in:
Wilco Dijkstra 2023-02-03 12:01:33 +00:00
parent d2d3f3720c
commit 32c7acd464
24 changed files with 34 additions and 48 deletions

View File

@ -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);
}

View File

@ -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. */

View File

@ -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

View File

@ -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';

View File

@ -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');

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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++;

View File

@ -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] != '/')

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -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))

View File

@ -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? */

View File

@ -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')

View File

@ -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;

View File

@ -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));

View File

@ -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;
}
}

View File

@ -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));

View File

@ -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)

View File

@ -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);
}

View File

@ -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);
}