Commit 18063d46 authored by Rob Pike's avatar Rob Pike

fmt.Scan: empty strings are errors

Fixes #1002.

R=rsc
CC=golang-dev
https://golang.org/cl/1882046
parent df88fc61
...@@ -598,18 +598,24 @@ func (s *ss) scanComplex(verb int, n int) complex128 { ...@@ -598,18 +598,24 @@ func (s *ss) scanComplex(verb int, n int) complex128 {
// convertString returns the string represented by the next input characters. // convertString returns the string represented by the next input characters.
// The format of the input is determined by the verb. // 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") { if !s.okVerb(verb, "svqx", "string") {
return "" return ""
} }
s.skipSpace(false) s.skipSpace(false)
switch verb { switch verb {
case 'q': case 'q':
return s.quotedString() str = s.quotedString()
case 'x': 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. // quotedString returns the double- or back-quoted string represented by the next input characters.
......
...@@ -464,6 +464,46 @@ func TestScanMultiple(t *testing.T) { ...@@ -464,6 +464,46 @@ func TestScanMultiple(t *testing.T) {
if a != 123 || s != "abc" { if a != 123 || s != "abc" {
t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s) 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) { func TestScanNotPointer(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment