mirror of https://github.com/golang/go.git
strconv: use Quote to escape the input string for failed conversion errors
This reveals the presence of control and non-printable characters in the errors returned by the Parse functions. Also add unit tests for NumError. R=golang-dev, r, rsc CC=golang-dev https://golang.org/cl/7393075
This commit is contained in:
parent
ee95c95ebd
commit
1300fb5449
|
|
@ -110,6 +110,7 @@ var atoftests = []atofTest{
|
|||
{"1e", "0", ErrSyntax},
|
||||
{"1e-", "0", ErrSyntax},
|
||||
{".e-1", "0", ErrSyntax},
|
||||
{"1\x00.2", "0", ErrSyntax},
|
||||
|
||||
// http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
|
||||
{"2.2250738585072012e-308", "2.2250738585072014e-308", nil},
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ type NumError struct {
|
|||
}
|
||||
|
||||
func (e *NumError) Error() string {
|
||||
return "strconv." + e.Func + ": " + `parsing "` + e.Num + `": ` + e.Err.Error()
|
||||
return "strconv." + e.Func + ": " + "parsing " + Quote(e.Num) + ": " + e.Err.Error()
|
||||
}
|
||||
|
||||
func syntaxError(fn, str string) *NumError {
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
package strconv_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
. "strconv"
|
||||
"testing"
|
||||
|
|
@ -146,6 +147,16 @@ var atoi32tests = []atoi32Test{
|
|||
{"-2147483649", -1 << 31, ErrRange},
|
||||
}
|
||||
|
||||
type numErrorTest struct {
|
||||
num, want string
|
||||
}
|
||||
|
||||
var numErrorTests = []numErrorTest{
|
||||
{"0", `strconv.ParseFloat: parsing "0": failed`},
|
||||
{"`", "strconv.ParseFloat: parsing \"`\": failed"},
|
||||
{"1\x00.2", `strconv.ParseFloat: parsing "1\x00.2": failed`},
|
||||
}
|
||||
|
||||
func init() {
|
||||
// The atoi routines return NumErrors wrapping
|
||||
// the error and the string. Convert the tables above.
|
||||
|
|
@ -277,6 +288,19 @@ func TestParseInt(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestNumError(t *testing.T) {
|
||||
for _, test := range numErrorTests {
|
||||
err := &NumError{
|
||||
Func: "ParseFloat",
|
||||
Num: test.num,
|
||||
Err: errors.New("failed"),
|
||||
}
|
||||
if got := err.Error(); got != test.want {
|
||||
t.Errorf(`(&NumError{"ParseFloat", %q, "failed"}).Error() = %v, want %v`, test.num, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkAtoi(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
ParseInt("12345678", 10, 0)
|
||||
|
|
|
|||
Loading…
Reference in New Issue