* [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected
@ 2025-03-21 20:41 Alejandro Colomar
2025-03-21 21:31 ` Bruno Haible
` (3 more replies)
0 siblings, 4 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 20:41 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 1452 bytes --]
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
Hi Bruno,
This is one of the patches I will apply after your report. Please
review. Thanks!
Cheers,
Alex
man/man3/strtoul.3 | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..62b9f65f6 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,29 @@ .SH CAVEATS
and then determine if an error occurred by checking whether
.I errno
has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
+.SH BUGS
+.SS Signed numbers
+Negative values
+are considered valid input and
+are silently converted to the equivalent
+.I unsigned long
value.
+.P
+Users should reject signed numbers
+with a wrapper function.
+.IP
+.EX
+unsigned long
+strtoul_u(const char *restrict s, char **restrict endp, int base)
+{
+ while (isspace((unsigned char) *s))
+ s++;
+ if (!isxdigit((unsigned char) *s))
+ return 0;
+\&
+ return strtoul(s, endp, base);
+}
+.EE
.SH EXAMPLES
See the example on the
.BR strtol (3)
Range-diff against v0:
-: --------- > 1: 939641570 man/man3/strtoul.3: BUGS: Signed numbers are not rejected
base-commit: e921861a3d30cfc5f9263747a4e64a68e488288c
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected
2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
@ 2025-03-21 21:31 ` Bruno Haible
2025-03-21 22:21 ` Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
` (2 subsequent siblings)
3 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-21 21:31 UTC (permalink / raw)
To: linux-man, Alejandro Colomar
Alejandro Colomar wrote:
> This is one of the patches I will apply after your report. Please
> review.
Looks good to me, except for one line in the sample:
> + if (!isxdigit((unsigned char) *s))
For a general base, this should be
if (!isalnum((unsigned char) *s))
For base <= 16, it can be simplified to
if (!isxdigit((unsigned char) *s))
For base <= 10, it can be simplified to
if (!isdigit((unsigned char) *s))
Bruno
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS
2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
2025-03-21 21:31 ` Bruno Haible
@ 2025-03-21 22:18 ` Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
3 siblings, 2 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:18 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 2926 bytes --]
Hi Bruno,
This time, I've added a mention to white space. I've decided to put
both bugs in the same commit.
And I've added a commit clarifying how to do range checks correctly.
Have a lovely night!
Alex
Alejandro Colomar (2):
man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not
rejected
man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
man/man3/strtol.3 | 20 ++++++++++++++++++++
man/man3/strtoul.3 | 19 ++++++++++++++-----
2 files changed, 34 insertions(+), 5 deletions(-)
Range-diff against v1:
1: 939641570 ! 1: 8faa6a809 man/man3/strtoul.3: BUGS: Signed numbers are not rejected
@@ Metadata
Author: Alejandro Colomar <alx@kernel.org>
## Commit message ##
- man/man3/strtoul.3: BUGS: Signed numbers are not rejected
+ man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
+ ## man/man3/strtol.3 ##
+@@ man/man3/strtol.3: .SH CAVEATS
+ goto unsupported_base;
+ .EE
+ .in
++.SH BUGS
++.SS White space
++These functions silently accept leading white space.
++One should call
++.BR isspace (3)
++before
++.BR strtol ()
++to reject white space.
+ .SH EXAMPLES
+ The program shown below demonstrates the use of
+ .BR strtol ().
+
## man/man3/strtoul.3 ##
@@ man/man3/strtoul.3: .SH CAVEATS
and then determine if an error occurred by checking whether
@@ man/man3/strtoul.3: .SH CAVEATS
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
+-value.
+.SH BUGS
+.SS Signed numbers
+Negative values
+are considered valid input and
-+are silently converted to the equivalent
-+.I unsigned long
- value.
-+.P
-+Users should reject signed numbers
-+with a wrapper function.
-+.IP
-+.EX
-+unsigned long
-+strtoul_u(const char *restrict s, char **restrict endp, int base)
-+{
-+ while (isspace((unsigned char) *s))
-+ s++;
-+ if (!isxdigit((unsigned char) *s))
-+ return 0;
-+\&
-+ return strtoul(s, endp, base);
-+}
-+.EE
++are silently converted to
++.IR "\%unsigned\ long" .
++.SS White space
++These functions silently accept leading whitespace.
++.SS isxdigit(3)
++One should call
++.BR isxdigit (3)
++before
++.BR strtoul ()
++to reject white space and/or a sign.
.SH EXAMPLES
See the example on the
.BR strtol (3)
-: --------- > 2: b5244e62c man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
base-commit: e921861a3d30cfc5f9263747a4e64a68e488288c
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
@ 2025-03-21 22:18 ` Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:18 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 1516 bytes --]
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
man/man3/strtol.3 | 8 ++++++++
man/man3/strtoul.3 | 19 ++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 9323873a9..03047f10a 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -224,6 +224,14 @@ .SH CAVEATS
goto unsupported_base;
.EE
.in
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
+One should call
+.BR isspace (3)
+before
+.BR strtol ()
+to reject white space.
.SH EXAMPLES
The program shown below demonstrates the use of
.BR strtol ().
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..1832f9d73 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,20 @@ .SH CAVEATS
and then determine if an error occurred by checking whether
.I errno
has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
-value.
+.SH BUGS
+.SS Signed numbers
+Negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
+.SS isxdigit(3)
+One should call
+.BR isxdigit (3)
+before
+.BR strtoul ()
+to reject white space and/or a sign.
.SH EXAMPLES
See the example on the
.BR strtol (3)
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-21 22:18 ` Alejandro Colomar
1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:18 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 815 bytes --]
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
man/man3/strtol.3 | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 03047f10a..973d6a78b 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -192,6 +192,7 @@ .SH HISTORY
.BR strtoll ()
POSIX.1-2001, C99.
.SH CAVEATS
+.SS Range checks
Since
.BR strtol ()
can legitimately return 0,
@@ -210,6 +211,17 @@ .SH CAVEATS
.I errno == ERANGE
after the call.
.P
+.in +4n
+.EX
+errno = 0;
+n = strtol(s, NULL, base)
+if ((errno == ERANGE && n == min) || n < min)
+ goto too_low;
+if ((errno == ERANGE && n == max) || n > max)
+ goto too_high;
+.EE
+.in
+.SS base
If the
.I base
needs to be tested,
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected
2025-03-21 21:31 ` Bruno Haible
@ 2025-03-21 22:21 ` Alejandro Colomar
0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:21 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 801 bytes --]
Hi,
On Fri, Mar 21, 2025 at 10:31:39PM +0100, Bruno Haible wrote:
> Alejandro Colomar wrote:
> > This is one of the patches I will apply after your report. Please
> > review.
>
> Looks good to me, except for one line in the sample:
>
> > + if (!isxdigit((unsigned char) *s))
>
> For a general base, this should be
>
> if (!isalnum((unsigned char) *s))
Hmmm, thanks! I fogot about base 29. :)
I'll take that for v3.
>
> For base <= 16, it can be simplified to
>
> if (!isxdigit((unsigned char) *s))
>
> For base <= 10, it can be simplified to
>
> if (!isdigit((unsigned char) *s))
Yep, although I won't mention that. Since isalnum(3) works for all,
I'll say that.
Cheers,
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS
2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
2025-03-21 21:31 ` Bruno Haible
2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23 0:30 ` Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
3 siblings, 2 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 0:30 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 1847 bytes --]
Hi!
Here's v3, suggesting alnum(3) instead of isxdigit(3), and also making
the wording slightly more precise, since not all negative numbers are
accepted; only some (I don't feel like explaining it with details; it's
easier to just say it's a bug to be workarounded). Add a link.
Cheers,
Alex
Alejandro Colomar (2):
man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not
rejected
man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
man/man3/strtol.3 | 20 ++++++++++++++++++++
man/man3/strtoul.3 | 19 ++++++++++++++-----
2 files changed, 34 insertions(+), 5 deletions(-)
Range-diff against v2:
1: 8faa6a809 ! 1: 3c456a1a0 man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
@@ Metadata
## Commit message ##
man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
+ Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
@@ man/man3/strtoul.3: .SH CAVEATS
-value.
+.SH BUGS
+.SS Signed numbers
-+Negative values
++Some negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
-+.SS isxdigit(3)
++.SS isalnum(3)
+One should call
-+.BR isxdigit (3)
++.BR isalnum (3)
+before
+.BR strtoul ()
+to reject white space and/or a sign.
2: b5244e62c = 2: 020b468a3 man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
base-commit: e921861a3d30cfc5f9263747a4e64a68e488288c
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23 0:30 ` Alejandro Colomar
2025-03-23 10:27 ` Bruno Haible
2025-03-23 0:30 ` [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 0:30 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 1640 bytes --]
Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
man/man3/strtol.3 | 8 ++++++++
man/man3/strtoul.3 | 19 ++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 9323873a9..03047f10a 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -224,6 +224,14 @@ .SH CAVEATS
goto unsupported_base;
.EE
.in
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
+One should call
+.BR isspace (3)
+before
+.BR strtol ()
+to reject white space.
.SH EXAMPLES
The program shown below demonstrates the use of
.BR strtol ().
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..9e73190f5 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,20 @@ .SH CAVEATS
and then determine if an error occurred by checking whether
.I errno
has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
-value.
+.SH BUGS
+.SS Signed numbers
+Some negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
+.SS isalnum(3)
+One should call
+.BR isalnum (3)
+before
+.BR strtoul ()
+to reject white space and/or a sign.
.SH EXAMPLES
See the example on the
.BR strtol (3)
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
2025-03-23 0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 0:30 ` Alejandro Colomar
1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 0:30 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 815 bytes --]
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
man/man3/strtol.3 | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 03047f10a..973d6a78b 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -192,6 +192,7 @@ .SH HISTORY
.BR strtoll ()
POSIX.1-2001, C99.
.SH CAVEATS
+.SS Range checks
Since
.BR strtol ()
can legitimately return 0,
@@ -210,6 +211,17 @@ .SH CAVEATS
.I errno == ERANGE
after the call.
.P
+.in +4n
+.EX
+errno = 0;
+n = strtol(s, NULL, base)
+if ((errno == ERANGE && n == min) || n < min)
+ goto too_low;
+if ((errno == ERANGE && n == max) || n > max)
+ goto too_high;
+.EE
+.in
+.SS base
If the
.I base
needs to be tested,
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 0:30 ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 10:27 ` Bruno Haible
2025-03-23 11:15 ` Alejandro Colomar
0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 10:27 UTC (permalink / raw)
To: linux-man, Alejandro Colomar
Thanks for theses BUGS sections, Alejandro.
> +.SS White space
> +These functions silently accept leading white space.
> +One should call
> +.BR isspace (3)
> +before
> +.BR strtol ()
> +to reject white space.
Just a question of wording, but it would be more straightforward to read
when written like this:
+.SS White space
+These functions silently accept leading white space.
+In situations where rejecting white space is desired instead, call
+.BR isspace (3)
+before
+.BR strtol ().
(As usual, presenting the "why" and "what" before the "how" is nicer. [1])
> +One should call
> +.BR isalnum (3)
> +before
> +.BR strtoul ()
> +to reject white space and/or a sign.
Likewise here. It is more straightforward when written like this:
+To reject white space and/or a sign, call
+.BR isalnum (3)
+before
+.BR strtoul ().
Bruno
[1] https://gitlab.com/ghwiki/gnow-how/-/wikis/Documentation/Writing
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 10:27 ` Bruno Haible
@ 2025-03-23 11:15 ` Alejandro Colomar
0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:15 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 1474 bytes --]
Hi Bruno,
On Sun, Mar 23, 2025 at 11:27:53AM +0100, Bruno Haible wrote:
> Thanks for theses BUGS sections, Alejandro.
>
> > +.SS White space
> > +These functions silently accept leading white space.
> > +One should call
> > +.BR isspace (3)
> > +before
> > +.BR strtol ()
> > +to reject white space.
>
> Just a question of wording, but it would be more straightforward to read
> when written like this:
>
> +.SS White space
> +These functions silently accept leading white space.
> +In situations where rejecting white space is desired instead, call
> +.BR isspace (3)
> +before
> +.BR strtol ().
>
> (As usual, presenting the "why" and "what" before the "how" is nicer. [1])
LGTM. I'd make it shorter, though. How about this?
+.SS White space
+These functions silently accept leading white space.
+To reject white space, call
+.BR isspace (3)
+before
+.BR strtol ().
which BTW makes it more consistent with your proposal from below.
>
> > +One should call
> > +.BR isalnum (3)
> > +before
> > +.BR strtoul ()
> > +to reject white space and/or a sign.
>
> Likewise here. It is more straightforward when written like this:
>
> +To reject white space and/or a sign, call
> +.BR isalnum (3)
> +before
> +.BR strtoul ().
>
> Bruno
>
> [1] https://gitlab.com/ghwiki/gnow-how/-/wikis/Documentation/Writing
Thanks! That's useful. :)
Have a lovely day!
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS
2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
` (2 preceding siblings ...)
2025-03-23 0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23 11:43 ` Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
3 siblings, 2 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:43 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 1910 bytes --]
Hi!
Here's v4, with minor wording fixes. Bruno, I've added you as
Co-authored-by in patch 1/2. Please sign the patch if you like it.
Cheers,
Alex
Alejandro Colomar (2):
man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not
rejected
man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
man/man3/strtol.3 | 19 +++++++++++++++++++
man/man3/strtoul.3 | 18 +++++++++++++-----
2 files changed, 32 insertions(+), 5 deletions(-)
Range-diff against v3:
1: 3c456a1a0 ! 1: 4a1de398d man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
@@ Commit message
Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
Reported-by: Bruno Haible <bruno@clisp.org>
+ Co-authored-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
## man/man3/strtol.3 ##
@@ man/man3/strtol.3: .SH CAVEATS
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
-+One should call
++To reject white space, call
+.BR isspace (3)
+before
-+.BR strtol ()
-+to reject white space.
++.BR strtol ().
.SH EXAMPLES
The program shown below demonstrates the use of
.BR strtol ().
@@ man/man3/strtoul.3: .SH CAVEATS
+.SS White space
+These functions silently accept leading whitespace.
+.SS isalnum(3)
-+One should call
++To reject white space and/or a sign, call
+.BR isalnum (3)
+before
-+.BR strtoul ()
-+to reject white space and/or a sign.
++.BR strtoul ().
.SH EXAMPLES
See the example on the
.BR strtol (3)
2: 020b468a3 = 2: 98af3aa6c man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23 11:43 ` Alejandro Colomar
2025-03-23 13:20 ` Bruno Haible
2025-03-23 11:43 ` [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:43 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 1662 bytes --]
Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
Reported-by: Bruno Haible <bruno@clisp.org>
Co-authored-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
man/man3/strtol.3 | 7 +++++++
man/man3/strtoul.3 | 18 +++++++++++++-----
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 9323873a9..f9c9af4bc 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -224,6 +224,13 @@ .SH CAVEATS
goto unsupported_base;
.EE
.in
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
+To reject white space, call
+.BR isspace (3)
+before
+.BR strtol ().
.SH EXAMPLES
The program shown below demonstrates the use of
.BR strtol ().
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..c4f8961a4 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,19 @@ .SH CAVEATS
and then determine if an error occurred by checking whether
.I errno
has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
-value.
+.SH BUGS
+.SS Signed numbers
+Some negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
+.SS isalnum(3)
+To reject white space and/or a sign, call
+.BR isalnum (3)
+before
+.BR strtoul ().
.SH EXAMPLES
See the example on the
.BR strtol (3)
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 11:43 ` Alejandro Colomar
1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:43 UTC (permalink / raw)
To: linux-man, Bruno Haible; +Cc: Alejandro Colomar
[-- Attachment #1: Type: text/plain, Size: 815 bytes --]
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
man/man3/strtol.3 | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index f9c9af4bc..f1c5b6ec1 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -192,6 +192,7 @@ .SH HISTORY
.BR strtoll ()
POSIX.1-2001, C99.
.SH CAVEATS
+.SS Range checks
Since
.BR strtol ()
can legitimately return 0,
@@ -210,6 +211,17 @@ .SH CAVEATS
.I errno == ERANGE
after the call.
.P
+.in +4n
+.EX
+errno = 0;
+n = strtol(s, NULL, base)
+if ((errno == ERANGE && n == min) || n < min)
+ goto too_low;
+if ((errno == ERANGE && n == max) || n > max)
+ goto too_high;
+.EE
+.in
+.SS base
If the
.I base
needs to be tested,
--
2.47.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 11:43 ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 13:20 ` Bruno Haible
2025-03-23 14:00 ` Alejandro Colomar
0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 13:20 UTC (permalink / raw)
To: linux-man, Alejandro Colomar
Looks all good to me.
Signed-off-by: Bruno Haible <bruno@clisp.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 13:20 ` Bruno Haible
@ 2025-03-23 14:00 ` Alejandro Colomar
2025-03-23 15:52 ` Bruno Haible
0 siblings, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 14:00 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 435 bytes --]
Hi Bruno,
On Sun, Mar 23, 2025 at 02:20:28PM +0100, Bruno Haible wrote:
> Looks all good to me.
>
> Signed-off-by: Bruno Haible <bruno@clisp.org>
Thanks! I've applied this patch:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>
Is patch 2/2 also good to you?
Have a lovely day!
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 14:00 ` Alejandro Colomar
@ 2025-03-23 15:52 ` Bruno Haible
2025-03-23 16:55 ` Alejandro Colomar
2025-03-23 18:55 ` Alejandro Colomar
0 siblings, 2 replies; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 15:52 UTC (permalink / raw)
To: Alejandro Colomar; +Cc: linux-man
Alejandro Colomar wrote:
> Is patch 2/2 also good to you?
I couldn't tell without looking at the entire page
("groff -Tutf8 -mandoc strtol.3 | less -R"). But now...
> <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>
you gave me the information where to look at your work-in-progress tree.
Here are my findings on these two pages:
* In strtol.3, the example has three mistakes:
- Missing semicolon at the end of the second line.
- If LONG_MIN < min < LONG_MAX, the condition (errno == ERANGE && n == min)
will never be true.
If LONG_MIN < max < LONG_MAX, the condition (errno == ERANGE && n == max)
will never be true.
- It does not distinguish success with value 0 from failure due to
no digits. (This matters when min <= 0 <= max.) Since errno is not
guaranteed to be set in this case, the caller needs to look at *endptr.
The example thus becomes:
char *end;
errno = 0;
n = strtol(s, &end, base);
if (end == s)
goto no_number;
if ((errno == ERANGE && n == LONG_MIN) || n < min)
goto too_low;
if ((errno == ERANGE && n == LONG_MAX) || n > max)
goto too_high;
* strtol.3 and strtoul.3 mention
"If base is zero or 16, the string may then include a "0x" or "0X" prefix,
and the number will be read in base 16"
They should also mention:
"If base is zero or 2, the string may then include a "0b" or "0B" prefix,
and the number will be read in base 2"
References:
- ISO C 23 § 7.24.1.7.(3)
- https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c
Bruno
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 15:52 ` Bruno Haible
@ 2025-03-23 16:55 ` Alejandro Colomar
2025-03-23 17:03 ` Alejandro Colomar
2025-03-23 18:55 ` Alejandro Colomar
1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 16:55 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 2691 bytes --]
Hi Bruno,
On Sun, Mar 23, 2025 at 04:52:15PM +0100, Bruno Haible wrote:
> Alejandro Colomar wrote:
> > Is patch 2/2 also good to you?
>
> I couldn't tell without looking at the entire page
> ("groff -Tutf8 -mandoc strtol.3 | less -R"). But now...
>
> > <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>
>
> you gave me the information where to look at your work-in-progress tree.
Yup. :)
> Here are my findings on these two pages:
>
> * In strtol.3, the example has three mistakes:
> - Missing semicolon at the end of the second line.
Thanks!
> - If LONG_MIN < min < LONG_MAX, the condition (errno == ERANGE && n == min)
> will never be true.
> If LONG_MIN < max < LONG_MAX, the condition (errno == ERANGE && n == max)
> will never be true.
D'oh! I'm too used to strtoi(3bsd) that I make these mistakes when
switching to strtol(3).
> - It does not distinguish success with value 0 from failure due to
> no digits. (This matters when min <= 0 <= max.) Since errno is not
> guaranteed to be set in this case, the caller needs to look at *endptr.
> The example thus becomes:
Yeah, I wanted to isolate the range checking from the rest. Maybe I
should just put this in that sample code?:
if ((errno == ERANGE && n == LONG_MIN) || n < min)
goto too_low;
if ((errno == ERANGE && n == LONG_MAX) || n > max)
goto too_high;
Without having the strtol(3) call at all?
>
> char *end;
> errno = 0;
> n = strtol(s, &end, base);
> if (end == s)
> goto no_number;
> if ((errno == ERANGE && n == LONG_MIN) || n < min)
> goto too_low;
> if ((errno == ERANGE && n == LONG_MAX) || n > max)
> goto too_high;
On the other hand, I should put this in the EXAMPLES section, to have
a full example.
>
> * strtol.3 and strtoul.3 mention
> "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
> and the number will be read in base 16"
> They should also mention:
> "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
> and the number will be read in base 2"
Yep, I need to update many pages for C23. I'll do this update for this
page now.
Thanks!
Cheers,
Alex
> References:
> - ISO C 23 § 7.24.1.7.(3)
> - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c
>
> Bruno
>
>
>
>
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 16:55 ` Alejandro Colomar
@ 2025-03-23 17:03 ` Alejandro Colomar
2025-03-23 17:11 ` Bruno Haible
0 siblings, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 17:03 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 3158 bytes --]
On Sun, Mar 23, 2025 at 05:55:50PM +0100, Alejandro Colomar wrote:
> Hi Bruno,
>
> On Sun, Mar 23, 2025 at 04:52:15PM +0100, Bruno Haible wrote:
> > Alejandro Colomar wrote:
> > > Is patch 2/2 also good to you?
> >
> > I couldn't tell without looking at the entire page
> > ("groff -Tutf8 -mandoc strtol.3 | less -R"). But now...
> >
> > > <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>
> >
> > you gave me the information where to look at your work-in-progress tree.
>
> Yup. :)
>
> > Here are my findings on these two pages:
> >
> > * In strtol.3, the example has three mistakes:
> > - Missing semicolon at the end of the second line.
>
> Thanks!
>
> > - If LONG_MIN < min < LONG_MAX, the condition (errno == ERANGE && n == min)
> > will never be true.
> > If LONG_MIN < max < LONG_MAX, the condition (errno == ERANGE && n == max)
> > will never be true.
>
> D'oh! I'm too used to strtoi(3bsd) that I make these mistakes when
> switching to strtol(3).
>
> > - It does not distinguish success with value 0 from failure due to
> > no digits. (This matters when min <= 0 <= max.) Since errno is not
> > guaranteed to be set in this case, the caller needs to look at *endptr.
> > The example thus becomes:
>
> Yeah, I wanted to isolate the range checking from the rest. Maybe I
> should just put this in that sample code?:
>
> if ((errno == ERANGE && n == LONG_MIN) || n < min)
> goto too_low;
> if ((errno == ERANGE && n == LONG_MAX) || n > max)
> goto too_high;
>
> Without having the strtol(3) call at all?
>
> >
> > char *end;
> > errno = 0;
> > n = strtol(s, &end, base);
> > if (end == s)
> > goto no_number;
> > if ((errno == ERANGE && n == LONG_MIN) || n < min)
> > goto too_low;
> > if ((errno == ERANGE && n == LONG_MAX) || n > max)
> > goto too_high;
>
I ended up doing what you said:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=ebe5a89dcd431d15c54ebc22eaa35721496fee4b>
> On the other hand, I should put this in the EXAMPLES section, to have
> a full example.
>
> >
> > * strtol.3 and strtoul.3 mention
> > "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
> > and the number will be read in base 16"
> > They should also mention:
> > "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
> > and the number will be read in base 2"
>
> Yep, I need to update many pages for C23. I'll do this update for this
> page now.
>
> Thanks!
>
>
> Cheers,
> Alex
>
> > References:
> > - ISO C 23 § 7.24.1.7.(3)
> > - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c
> >
> > Bruno
> >
> >
> >
> >
>
> --
> <https://www.alejandro-colomar.es/>
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 17:03 ` Alejandro Colomar
@ 2025-03-23 17:11 ` Bruno Haible
2025-03-23 18:35 ` Alejandro Colomar
0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 17:11 UTC (permalink / raw)
To: Alejandro Colomar; +Cc: linux-man
Alejandro,
> I ended up doing what you said:
>
> <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=ebe5a89dcd431d15c54ebc22eaa35721496fee4b>
+if ((errno == ERANGE && n == LONG_MIN) || n > max)
Here: LONG_MIN -> LONG_MAX
Signed-off-by: Bruno Haible <bruno@clisp.org>
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 17:11 ` Bruno Haible
@ 2025-03-23 18:35 ` Alejandro Colomar
0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 18:35 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 502 bytes --]
On Sun, Mar 23, 2025 at 06:11:39PM +0100, Bruno Haible wrote:
> Alejandro,
>
> > I ended up doing what you said:
> >
> > <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=ebe5a89dcd431d15c54ebc22eaa35721496fee4b>
>
> +if ((errno == ERANGE && n == LONG_MIN) || n > max)
>
> Here: LONG_MIN -> LONG_MAX
>
> Signed-off-by: Bruno Haible <bruno@clisp.org>
Thanks! Ameded and pushed.
Cheers,
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 15:52 ` Bruno Haible
2025-03-23 16:55 ` Alejandro Colomar
@ 2025-03-23 18:55 ` Alejandro Colomar
2025-03-23 19:26 ` Bruno Haible
1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 18:55 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 4865 bytes --]
Hi Bruno,
On Sun, Mar 23, 2025 at 04:52:15PM +0100, Bruno Haible wrote:
> * strtol.3 and strtoul.3 mention
> "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
> and the number will be read in base 16"
> They should also mention:
> "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
> and the number will be read in base 2"
> References:
> - ISO C 23 § 7.24.1.7.(3)
> - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c
Here's the proposed fix:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=4f35fc20ec258842b713da6b0e7d06fd59b70abe>
alx@devuan:~/src/linux/man-pages/man-pages/contrib$ git show
commit 4f35fc20ec258842b713da6b0e7d06fd59b70abe (HEAD -> contrib, alx/contrib)
Author: Alejandro Colomar <alx@kernel.org>
Date: Sun Mar 23 19:47:33 2025 +0100
man/man3/strto[u]l.3: C23 added "0b" and "0B"
Link: <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c>
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 2ae48119b..9c8791b07 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -53,8 +53,13 @@ .SH DESCRIPTION
If
.I base
is zero or 16, the string may then include a
-"0x" or "0X" prefix, and the number will be read in base 16; otherwise, a
-zero
+"0x" or "0X" prefix, and the number will be read in base 16;
+if
+.I base
+is zero or 2, the string may then include a
+"0b" or "0B" prefix, and the number will be read in base 2;
+otherwise,
+a zero
.I base
is taken as 10 (decimal) unless the next character
is \[aq]0\[aq], in which case it is taken as 8 (octal).
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index c6a2bb9be..4e85f7a30 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -59,8 +59,13 @@ .SH DESCRIPTION
If
.I base
is zero or 16, the string may then include a
-"0x" or "0X" prefix, and the number will be read in base 16; otherwise, a
-zero
+"0x" or "0X" prefix, and the number will be read in base 16;
+if
+.I base
+is zero or 2, the string may then include a
+"0b" or "0B" prefix, and the number will be read in base 2;
+otherwise,
+a zero
.I base
is taken as 10 (decimal) unless the next character
is \[aq]0\[aq], in which case it is taken as 8 (octal).
@@ -182,7 +187,7 @@ .SH VERSIONS
or to
.BR strtoul ().
.SH STANDARDS
-C11, POSIX.1-2008.
+C23, POSIX.1-2008.
.SH HISTORY
.TP
.BR strtoul ()
@@ -190,6 +195,10 @@ .SH HISTORY
.TP
.BR strtoull ()
POSIX.1-2001, C99.
+.TP
+"0b", "0B"
+C23.
+glibc 2.38.
.SH CAVEATS
Since
.BR strtoul ()
And here's a diff of the rendered pages:
alx@devuan:~/src/linux/man-pages/man-pages/contrib$ diffman-git HEAD
--- HEAD^:man/man3/strtol.3
+++ HEAD:man/man3/strtol.3
@@ -32,7 +32,9 @@
space (as determined by isspace(3)) followed by a single
optional '+' or '-' sign. If base is zero or 16, the
string may then include a "0x" or "0X" prefix, and the
- number will be read in base 16; otherwise, a zero base is
+ number will be read in base 16; if base is zero or 2, the
+ string may then include a "0b" or "0B" prefix, and the
+ number will be read in base 2; otherwise, a zero base is
taken as 10 (decimal) unless the next character is '0', in
which case it is taken as 8 (octal).
--- HEAD^:man/man3/strtoul.3
+++ HEAD:man/man3/strtoul.3
@@ -32,7 +32,9 @@
space (as determined by isspace(3)) followed by a single
optional '+' or '-' sign. If base is zero or 16, the
string may then include a "0x" or "0X" prefix, and the
- number will be read in base 16; otherwise, a zero base is
+ number will be read in base 16; if base is zero or 2, the
+ string may then include a "0b" or "0B" prefix, and the
+ number will be read in base 2; otherwise, a zero base is
taken as 10 (decimal) unless the next character is '0', in
which case it is taken as 8 (octal).
@@ -100,7 +102,7 @@
lent to strtoull() or to strtoul().
STANDARDS
- C11, POSIX.1‐2008.
+ C23, POSIX.1‐2008.
HISTORY
strtoul()
@@ -109,6 +111,9 @@
strtoull()
POSIX.1‐2001, C99.
+ "0b", "0B"
+ C23. glibc 2.38.
+
CAVEATS
Since strtoul() can legitimately return 0 or ULONG_MAX
(ULLONG_MAX for strtoull()) on both success and failure,
Have a lovely night!
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 18:55 ` Alejandro Colomar
@ 2025-03-23 19:26 ` Bruno Haible
2025-03-23 19:47 ` Alejandro Colomar
0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 19:26 UTC (permalink / raw)
To: Alejandro Colomar; +Cc: linux-man
Alejandro Colomar wrote:
> diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
> index c6a2bb9be..4e85f7a30 100644
> --- a/man/man3/strtoul.3
> +++ b/man/man3/strtoul.3
> @@ -182,7 +187,7 @@ .SH VERSIONS
> or to
> .BR strtoul ().
> .SH STANDARDS
> -C11, POSIX.1-2008.
> +C23, POSIX.1-2008.
> .SH HISTORY
> .TP
> .BR strtoul ()
> @@ -190,6 +195,10 @@ .SH HISTORY
> .TP
> .BR strtoull ()
> POSIX.1-2001, C99.
> +.TP
> +"0b", "0B"
> +C23.
> +glibc 2.38.
> .SH CAVEATS
> Since
> .BR strtoul ()
These same two hunks could also be applied to strtol.3.
Bruno
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
2025-03-23 19:26 ` Bruno Haible
@ 2025-03-23 19:47 ` Alejandro Colomar
0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 19:47 UTC (permalink / raw)
To: Bruno Haible; +Cc: linux-man
[-- Attachment #1: Type: text/plain, Size: 1388 bytes --]
On Sun, Mar 23, 2025 at 08:26:02PM +0100, Bruno Haible wrote:
> Alejandro Colomar wrote:
> > diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
> > index c6a2bb9be..4e85f7a30 100644
> > --- a/man/man3/strtoul.3
> > +++ b/man/man3/strtoul.3
> > @@ -182,7 +187,7 @@ .SH VERSIONS
> > or to
> > .BR strtoul ().
> > .SH STANDARDS
> > -C11, POSIX.1-2008.
> > +C23, POSIX.1-2008.
> > .SH HISTORY
> > .TP
> > .BR strtoul ()
> > @@ -190,6 +195,10 @@ .SH HISTORY
> > .TP
> > .BR strtoull ()
> > POSIX.1-2001, C99.
> > +.TP
> > +"0b", "0B"
> > +C23.
> > +glibc 2.38.
> > .SH CAVEATS
> > Since
> > .BR strtoul ()
>
> These same two hunks could also be applied to strtol.3.
Yep, I had forgotten. I've applied them a moment ago. BTW, I also
updated the info about POSIX too:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=2b2519c7722166dbe4313da6ec048d137ea42ba7>
@@ -183,7 +188,7 @@ .SH VERSIONS
or to
.BR strtol ().
.SH STANDARDS
-C11, POSIX.1-2008.
+C23, POSIX.1-2024.
.SH HISTORY
.TP
.BR strtol ()
@@ -191,6 +196,11 @@ .SH HISTORY
.TP
.BR strtoll ()
POSIX.1-2001, C99.
+.TP
+"0b", "0B"
+C23.
+glibc 2.38.
+(Not in POSIX.)
.SH CAVEATS
.SS Range checks
Since
Cheers,
Alex
--
<https://www.alejandro-colomar.es/>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2025-03-23 19:47 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
2025-03-21 21:31 ` Bruno Haible
2025-03-21 22:21 ` Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-23 10:27 ` Bruno Haible
2025-03-23 11:15 ` Alejandro Colomar
2025-03-23 0:30 ` [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-23 13:20 ` Bruno Haible
2025-03-23 14:00 ` Alejandro Colomar
2025-03-23 15:52 ` Bruno Haible
2025-03-23 16:55 ` Alejandro Colomar
2025-03-23 17:03 ` Alejandro Colomar
2025-03-23 17:11 ` Bruno Haible
2025-03-23 18:35 ` Alejandro Colomar
2025-03-23 18:55 ` Alejandro Colomar
2025-03-23 19:26 ` Bruno Haible
2025-03-23 19:47 ` Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox