mirror of
https://github.com/golang/go
synced 2024-11-25 20:57:57 -07:00
fmt.Scan: empty strings are errors
Fixes #1002. R=rsc CC=golang-dev https://golang.org/cl/1882046
This commit is contained in:
parent
df88fc6109
commit
18063d4686
@ -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
|
||||||
}
|
}
|
||||||
return 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
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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) {
|
|||||||
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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user