summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2010-08-07 10:02:04 +1000
committerRob Pike <r@golang.org>2010-08-07 10:02:04 +1000
commite160d1de6d0fa73034e2a224b376cc74a1c0e9cd (patch)
treeda9d5a377cf4eb763d30c3ab6ee84c58882ddc22
parent66a2144adc76ee26ac4f12be06b56e777d2e40e8 (diff)
downloadgo-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.go14
-rw-r--r--src/pkg/fmt/scan_test.go40
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) {