diff options
author | Rob Pike <r@golang.org> | 2010-08-07 10:02:04 +1000 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2010-08-07 10:02:04 +1000 |
commit | e160d1de6d0fa73034e2a224b376cc74a1c0e9cd (patch) | |
tree | da9d5a377cf4eb763d30c3ab6ee84c58882ddc22 | |
parent | 66a2144adc76ee26ac4f12be06b56e777d2e40e8 (diff) | |
download | go-e160d1de6d0fa73034e2a224b376cc74a1c0e9cd.tar.gz |
fmt.Scan: empty strings are errors
Fixes issue 1002.
R=rsc
CC=golang-dev
http://codereview.appspot.com/1882046
-rw-r--r-- | src/pkg/fmt/scan.go | 14 | ||||
-rw-r--r-- | src/pkg/fmt/scan_test.go | 40 |
2 files changed, 50 insertions, 4 deletions
diff --git a/src/pkg/fmt/scan.go b/src/pkg/fmt/scan.go index fad7dbf55..afbbeb394 100644 --- a/src/pkg/fmt/scan.go +++ b/src/pkg/fmt/scan.go @@ -598,18 +598,24 @@ func (s *ss) scanComplex(verb int, n int) complex128 { // convertString returns the string represented by the next input characters. // The format of the input is determined by the verb. -func (s *ss) convertString(verb int) string { +func (s *ss) convertString(verb int) (str string) { if !s.okVerb(verb, "svqx", "string") { return "" } s.skipSpace(false) switch verb { case 'q': - return s.quotedString() + str = s.quotedString() case 'x': - return s.hexString() + str = s.hexString() + default: + str = s.token() // %s and %v just return the next word + } + // Empty strings other than with %q are not OK. + if len(str) == 0 && verb != 'q' && s.maxWid > 0 { + s.errorString("Scan: no data for string") } - return s.token() // %s and %v just return the next word + return } // quotedString returns the double- or back-quoted string represented by the next input characters. diff --git a/src/pkg/fmt/scan_test.go b/src/pkg/fmt/scan_test.go index 05112438d..909278989 100644 --- a/src/pkg/fmt/scan_test.go +++ b/src/pkg/fmt/scan_test.go @@ -464,6 +464,46 @@ func TestScanMultiple(t *testing.T) { if a != 123 || s != "abc" { t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s) } + n, err = Sscan("asdf", &s, &a) + if n != 1 { + t.Errorf("Sscan count error: expected 1: got %d", n) + } + if err == nil { + t.Errorf("Sscan expected error; got none", err) + } + if s != "asdf" { + t.Errorf("Sscan wrong values: got %q expected \"asdf\"", s) + } +} + +// Empty strings are not valid input when scanning a string. +func TestScanEmpty(t *testing.T) { + var s1, s2 string + n, err := Sscan("abc", &s1, &s2) + if n != 1 { + t.Errorf("Sscan count error: expected 1: got %d", n) + } + if err == nil { + t.Errorf("Sscan <one item> expected error; got none") + } + if s1 != "abc" { + t.Errorf("Sscan wrong values: got %q expected \"abc\"", s1) + } + n, err = Sscan("", &s1, &s2) + if n != 0 { + t.Errorf("Sscan count error: expected 0: got %d", n) + } + if err == nil { + t.Errorf("Sscan <empty> expected error; got none") + } + // Quoted empty string is OK. + n, err = Sscanf(`""`, "%q", &s1) + if n != 1 { + t.Errorf("Sscanf count error: expected 1: got %d", n) + } + if err != nil { + t.Errorf("Sscanf <empty> expected no error with quoted string; got %s", err) + } } func TestScanNotPointer(t *testing.T) { |