aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2020-04-30 13:24:05 -0700
committerRobert Griesemer <gri@golang.org>2020-04-30 21:34:51 +0000
commit8740bdc5afd07cf62722907644f65411cc52fa1c (patch)
tree05eeb98fc8c88ffa3764190cc1223de7eb10c617 /src
parent0f8fecaba762c352db481d4919edf404f5590d22 (diff)
downloadgo-8740bdc5afd07cf62722907644f65411cc52fa1c.tar.xz
strconv: fix for parseFloatPrefix
parseFloatPrefix accepts a string if it has a valid floating-point number as prefix. Make sure that "infi", "infin", ... etc. are accepted as valid numbers "inf" with suffix "i", "in", etc. This is important for parsing complex numbers such as "0+infi". This change does not affect the correctness of ParseFloat because ParseFloat rejects strings that contain a suffix after a valid floating-point number. Updates #36771. Change-Id: Ie1693a8ca2f8edf07b57688e0b35751b7100d39d Reviewed-on: https://go-review.googlesource.com/c/go/+/231237 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/strconv/atof.go6
-rw-r--r--src/strconv/atof_test.go5
2 files changed, 8 insertions, 3 deletions
diff --git a/src/strconv/atof.go b/src/strconv/atof.go
index c1e9907e09..28ad094080 100644
--- a/src/strconv/atof.go
+++ b/src/strconv/atof.go
@@ -55,7 +55,11 @@ func special(s string) (f float64, n int, ok bool) {
fallthrough
case 'i', 'I':
n := commonPrefixLenIgnoreCase(s, "infinity")
- // both "inf" and "infinity" are ok
+ // Anything longer than "inf" is ok, but if we
+ // don't have "infinity", only consume "inf".
+ if 3 < n && n < 8 {
+ n = 3
+ }
if n == 3 || n == 8 {
return math.Inf(sign), nsign + n, true
}
diff --git a/src/strconv/atof_test.go b/src/strconv/atof_test.go
index 8201e75af6..c30cb2e0fe 100644
--- a/src/strconv/atof_test.go
+++ b/src/strconv/atof_test.go
@@ -486,8 +486,9 @@ func TestParseFloatPrefix(t *testing.T) {
continue
}
// Adding characters that do not extend a number should not invalidate it.
- // Test a few.
- for _, suffix := range []string{" ", "q", "+", "-", "<", "=", ">", "(", ")"} {
+ // Test a few. The "i" and "init" cases test that we accept "infi", "infinit"
+ // correctly as "inf" with suffix.
+ for _, suffix := range []string{" ", "q", "+", "-", "<", "=", ">", "(", ")", "i", "init"} {
in := test.in + suffix
_, n, err := ParseFloatPrefix(in, 64)
if err != nil {