mirror of
https://github.com/golang/go
synced 2024-11-25 06:57:58 -07:00
go/scanner: report illegal escape sequences
R=golang-dev, r CC=golang-dev https://golang.org/cl/1636043
This commit is contained in:
parent
4032b7c5a1
commit
ace5269dfe
@ -36,7 +36,7 @@ apply1() {
|
|||||||
# the following files are skipped because they are test cases
|
# the following files are skipped because they are test cases
|
||||||
# for syntax errors and thus won't parse in the first place:
|
# for syntax errors and thus won't parse in the first place:
|
||||||
case `basename "$F"` in
|
case `basename "$F"` in
|
||||||
func3.go | const2.go | \
|
func3.go | const2.go | char_lit1.go | \
|
||||||
bug014.go | bug050.go | bug068.go | bug083.go | bug088.go | \
|
bug014.go | bug050.go | bug068.go | bug083.go | bug088.go | \
|
||||||
bug106.go | bug121.go | bug125.go | bug133.go | bug160.go | \
|
bug106.go | bug121.go | bug125.go | bug133.go | bug160.go | \
|
||||||
bug163.go | bug166.go | bug169.go | bug217.go | bug222.go | \
|
bug163.go | bug166.go | bug169.go | bug217.go | bug222.go | \
|
||||||
|
@ -345,34 +345,43 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (S *Scanner) scanDigits(base, length int) {
|
|
||||||
for length > 0 && digitVal(S.ch) < base {
|
|
||||||
S.next()
|
|
||||||
length--
|
|
||||||
}
|
|
||||||
if length > 0 {
|
|
||||||
S.error(S.pos, "illegal char escape")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
func (S *Scanner) scanEscape(quote int) {
|
func (S *Scanner) scanEscape(quote int) {
|
||||||
pos := S.pos
|
pos := S.pos
|
||||||
ch := S.ch
|
|
||||||
S.next()
|
var i, base, max uint32
|
||||||
switch ch {
|
switch S.ch {
|
||||||
case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote:
|
case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote:
|
||||||
// nothing to do
|
S.next()
|
||||||
|
return
|
||||||
case '0', '1', '2', '3', '4', '5', '6', '7':
|
case '0', '1', '2', '3', '4', '5', '6', '7':
|
||||||
S.scanDigits(8, 3-1) // 1 char read already
|
i, base, max = 3, 8, 255
|
||||||
case 'x':
|
case 'x':
|
||||||
S.scanDigits(16, 2)
|
S.next()
|
||||||
|
i, base, max = 2, 16, 255
|
||||||
case 'u':
|
case 'u':
|
||||||
S.scanDigits(16, 4)
|
S.next()
|
||||||
|
i, base, max = 4, 16, unicode.MaxRune
|
||||||
case 'U':
|
case 'U':
|
||||||
S.scanDigits(16, 8)
|
S.next()
|
||||||
|
i, base, max = 8, 16, unicode.MaxRune
|
||||||
default:
|
default:
|
||||||
S.error(pos, "illegal char escape")
|
S.next() // always make progress
|
||||||
|
S.error(pos, "unknown escape sequence")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var x uint32
|
||||||
|
for ; i > 0; i-- {
|
||||||
|
d := uint32(digitVal(S.ch))
|
||||||
|
if d > base {
|
||||||
|
S.error(S.pos, "illegal character in escape sequence")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
x = x*base + d
|
||||||
|
S.next()
|
||||||
|
}
|
||||||
|
if x > max || 0xd800 <= x && x < 0xe000 {
|
||||||
|
S.error(pos, "escape sequence is invalid Unicode code point")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user