]> Cypherpunks repositories - gostls13.git/commitdiff
fmt.Scan: empty strings are errors
authorRob Pike <r@golang.org>
Sat, 7 Aug 2010 00:02:04 +0000 (10:02 +1000)
committerRob Pike <r@golang.org>
Sat, 7 Aug 2010 00:02:04 +0000 (10:02 +1000)
Fixes #1002.

R=rsc
CC=golang-dev
https://golang.org/cl/1882046

src/pkg/fmt/scan.go
src/pkg/fmt/scan_test.go

index fad7dbf550482b8f00afe80ea37b6f8a210be8bf..afbbeb394805fe6b8101fce9a5f5f276578cecee 100644 (file)
@@ -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.
index 05112438d5f00065ecf2f6f82981b87de8e8d61b..90927898978e29745f45c643b81d4e83ee4e8c37 100644 (file)
@@ -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) {