Skip to contentSkip to conversation

memchr.3: Deprecate rawmemchr(3)

PATCH In review Alejandro Colomar 2 participants 2 messages Jan 5, 2023 – Jan 6, 2023 Man-pages: manual pages for Linux -- Sections 2, 3, 4, 5, and 7

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 memchr.3: Deprecate rawmemchr(3)

It is not optimized, and it calls either strlen(3) or memchr(3), so the caller can do it directly, and it will be better.

---
 man3/memchr.3 | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)
man3/memchr.3 +12 -16
index 68873964e..e03001bec 100644
@@ -22,7 +22,8 @@ .SH SYNOPSIS
 .PP
 .BI "void *memchr(const void " s [. n "], int " c ", size_t " n );
 .BI "void *memrchr(const void " s [. n "], int " c ", size_t " n );
-.BI "void *rawmemchr(const void " s [. n "], int " c );
+.PP
+.BI "[[deprecated]] void *rawmemchr(const void " s [. n "], int " c );
 .fi
 .PP
 .RS -4
@@ -66,26 +67,21 @@ .SH DESCRIPTION
 The
 .BR rawmemchr ()
 function is similar to
-.BR memchr ():
-it assumes (i.e., the programmer knows for certain)
+.BR memchr (),
+but it assumes
+(i.e., the programmer knows for certain)
 that an instance of
 .I c
 lies somewhere in the memory area starting at the location pointed to by
-.IR s ,
-and so performs an optimized search for
-.I c
-(i.e., no use of a count argument to limit the range of the search).
+.IR s .
 If an instance of
 .I c
-is not found, the results are unpredictable.
-The following call is a fast means of locating a string's
-terminating null byte:
-.PP
-.in +4n
-.EX
-char *p = rawmemchr(s,\ \(aq\e0\(aq);
-.EE
-.in
+is not found, the behavior is undefined.
+Use either
+.BR strlen (3)
+or
+.BR memchr (3)
+instead.
 .SH RETURN VALUE
 The
 .BR memchr ()
Signature · 1 line
2.39.0
#1 lore raw

Hi Alex,

Quoted 5 lines

It is not optimized, and it calls either strlen(3) or memchr(3), so the caller can do it directly, and it will be better.

This looks good to me. Btw in the codesearch there are about 800 uses, the majority looks like prototypes etc, so there are few actual uses. Interestingly GLIBC still contains this:

#ifdef _LIBC
      p = __rawmemchr (p, '\0');
#else
      p = strchr (p, '\0');

#endif

The strchr (p, 0) is optimized by compilers into strlen (since that's obviously the right optimization) so adding rawmemchr was not only wasted effort, but it made things slower as well. So we should remove these uses from GLIBC.

Cheers,
Wilco