mirror of
https://github.com/golang/go
synced 2024-11-23 18:20:04 -07:00
math/big: don't scan past a binary exponent if not accepted syntactically
TBR adonovan Change-Id: I842cbc855dbd560f65e76c9a557dff1a22c5d610 Reviewed-on: https://go-review.googlesource.com/4882 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
ccdbfe3174
commit
a809dc7adb
@ -46,11 +46,12 @@ func (z *Float) SetString(s string) (*Float, bool) {
|
|||||||
// digits = digit { digit } .
|
// digits = digit { digit } .
|
||||||
// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
|
// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
|
||||||
//
|
//
|
||||||
// The base argument must be 0 or a value between 2 through MaxBase.
|
// The base argument must be 0, 2, 10, or 16. Providing an invalid base
|
||||||
|
// argument will lead to a run-time panic.
|
||||||
//
|
//
|
||||||
// For base 0, the number prefix determines the actual base: A prefix of
|
// For base 0, the number prefix determines the actual base: A prefix of
|
||||||
// ``0x'' or ``0X'' selects base 16, and a ``0b'' or ``0B'' prefix selects
|
// ``0x'' or ``0X'' selects base 16, and a ``0b'' or ``0B'' prefix selects
|
||||||
// base 2; otherwise, the actual base is 10 and no prefix is permitted.
|
// base 2; otherwise, the actual base is 10 and no prefix is accepted.
|
||||||
// The octal prefix ``0'' is not supported.
|
// The octal prefix ``0'' is not supported.
|
||||||
//
|
//
|
||||||
// A "p" exponent indicates power of 2 for the exponent; for instance "1.2p3"
|
// A "p" exponent indicates power of 2 for the exponent; for instance "1.2p3"
|
||||||
@ -75,7 +76,7 @@ func (z *Float) Scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
|
|||||||
// exponent
|
// exponent
|
||||||
var exp int64
|
var exp int64
|
||||||
var ebase int
|
var ebase int
|
||||||
exp, ebase, err = scanExponent(r)
|
exp, ebase, err = scanExponent(r, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -78,9 +78,8 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
|
|||||||
|
|
||||||
// exponent
|
// exponent
|
||||||
var exp int64
|
var exp int64
|
||||||
var ebase int
|
exp, _, err = scanExponent(r, false)
|
||||||
exp, ebase, err = scanExponent(r)
|
if err != nil {
|
||||||
if ebase == 2 || err != nil {
|
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,7 +114,17 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
|
|||||||
return z, true
|
return z, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func scanExponent(r io.ByteScanner) (exp int64, base int, err error) {
|
// scanExponent scans the longest possible prefix of r representing a decimal
|
||||||
|
// ('e', 'E') or binary ('p') exponent, if any. It returns the exponent, the
|
||||||
|
// exponent base (10 or 2), or a read or syntax error, if any.
|
||||||
|
//
|
||||||
|
// exponent = ( "E" | "e" | "p" ) [ sign ] digits .
|
||||||
|
// sign = "+" | "-" .
|
||||||
|
// digits = digit { digit } .
|
||||||
|
// digit = "0" ... "9" .
|
||||||
|
//
|
||||||
|
// A binary exponent is only permitted if binExpOk is set.
|
||||||
|
func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err error) {
|
||||||
base = 10
|
base = 10
|
||||||
|
|
||||||
var ch byte
|
var ch byte
|
||||||
@ -130,7 +139,11 @@ func scanExponent(r io.ByteScanner) (exp int64, base int, err error) {
|
|||||||
case 'e', 'E':
|
case 'e', 'E':
|
||||||
// ok
|
// ok
|
||||||
case 'p':
|
case 'p':
|
||||||
|
if binExpOk {
|
||||||
base = 2
|
base = 2
|
||||||
|
break // ok
|
||||||
|
}
|
||||||
|
fallthrough // binary exponent not permitted
|
||||||
default:
|
default:
|
||||||
r.UnreadByte()
|
r.UnreadByte()
|
||||||
return // no exponent; same as e0
|
return // no exponent; same as e0
|
||||||
|
Loading…
Reference in New Issue
Block a user