[libc-commits] [libc] [NFC][libc] Clarifies underscores in n-char-sequence. (PR #102193)
Mark de Wever via libc-commits
libc-commits at lists.llvm.org
Tue Aug 6 11:29:44 PDT 2024
https://github.com/mordante created https://github.com/llvm/llvm-project/pull/102193
The C standard specifies
n-char-sequence:
digit
nondigit
n-char-sequence digit
n-char-sequence nondigit
nondigit is specified as one of:
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
This means nondigit includes the underscore character. This patch clarifies this status in the comments and the test.
Note C17 specifies n-char-sequence for NaN() as optional, and an empty sequence is not a valid n-char-sequence. However the current comment has the same effect as using the pedantic wording. So I left that part unchanged.
>From 86b9d6f488d3df230071a263e88086785356893c Mon Sep 17 00:00:00 2001
From: Mark de Wever <koraq at xs4all.nl>
Date: Tue, 6 Aug 2024 20:17:48 +0200
Subject: [PATCH] [libc] Clarifies underscores in n-char-sequence.
The C standard specifies
n-char-sequence:
digit
nondigit
n-char-sequence digit
n-char-sequence nondigit
nondigit is specified as one of:
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
This means nondigit includes the underscore character. This patch clarifies
this status in the comments and the test.
Note C17 specifies n-char-sequence for NaN() as optional, and an empty sequence
is not a valid n-char-sequence. However the current comment has the same effect
as using the pedantic wording. So I left that part unchanged.
---
libc/src/__support/str_to_float.h | 6 ++----
libc/test/src/stdlib/strtof_test.cpp | 2 +-
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/libc/src/__support/str_to_float.h b/libc/src/__support/str_to_float.h
index c72bc1f957dc3..c76119021cc45 100644
--- a/libc/src/__support/str_to_float.h
+++ b/libc/src/__support/str_to_float.h
@@ -1160,13 +1160,11 @@ LIBC_INLINE StrToNumResult<T> strtofloatingpoint(const char *__restrict src) {
index += 3;
StorageType nan_mantissa = 0;
// this handles the case of `NaN(n-character-sequence)`, where the
- // n-character-sequence is made of 0 or more letters and numbers in any
- // order.
+ // n-character-sequence is made of 0 or more letters, numbers, or
+ // underscore characters in any order.
if (src[index] == '(') {
size_t left_paren = index;
++index;
- // Apparently it's common for underscores to also be accepted. No idea
- // why, but it's causing fuzz failures.
while (isalnum(src[index]) || src[index] == '_')
++index;
if (src[index] == ')') {
diff --git a/libc/test/src/stdlib/strtof_test.cpp b/libc/test/src/stdlib/strtof_test.cpp
index d7991745b69e6..6a716c956291c 100644
--- a/libc/test/src/stdlib/strtof_test.cpp
+++ b/libc/test/src/stdlib/strtof_test.cpp
@@ -200,7 +200,7 @@ TEST_F(LlvmLibcStrToFTest, NaNWithParenthesesValidSequenceInvalidNumberTests) {
run_test("NaN(1a)", 7, 0x7fc00000);
run_test("NaN(asdf)", 9, 0x7fc00000);
run_test("NaN(1A1)", 8, 0x7fc00000);
- run_test("NaN(why_does_this_work)", 23, 0x7fc00000);
+ run_test("NaN(underscores_are_ok)", 23, 0x7fc00000);
run_test(
"NaN(1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM_)",
68, 0x7fc00000);
More information about the libc-commits
mailing list