diff options
| author | Robert Griesemer <gri@golang.org> | 2020-04-30 13:24:05 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2020-04-30 21:34:51 +0000 |
| commit | 8740bdc5afd07cf62722907644f65411cc52fa1c (patch) | |
| tree | 05eeb98fc8c88ffa3764190cc1223de7eb10c617 /src | |
| parent | 0f8fecaba762c352db481d4919edf404f5590d22 (diff) | |
| download | go-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.go | 6 | ||||
| -rw-r--r-- | src/strconv/atof_test.go | 5 |
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 { |
