mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: fix hex literal overflow check (#10782)
This commit is contained in:
parent
646c1e15e2
commit
de6918b8c9
@ -493,6 +493,8 @@ pub fn (mut c Checker) string_inter_lit(mut node ast.StringInterLiteral) ast.Typ
|
||||
return ast.string_type
|
||||
}
|
||||
|
||||
const hex_lit_overflow_message = 'hex character literal overflows string'
|
||||
|
||||
pub fn (mut c Checker) string_lit(mut node ast.StringLiteral) ast.Type {
|
||||
mut idx := 0
|
||||
for idx < node.val.len {
|
||||
@ -511,12 +513,24 @@ pub fn (mut c Checker) string_lit(mut node ast.StringLiteral) ast.Type {
|
||||
mut hex_char_count := 0
|
||||
for ch.is_hex_digit() {
|
||||
hex_char_count++
|
||||
if hex_char_count > 4 {
|
||||
end_pos := token.Position{
|
||||
...start_pos
|
||||
len: idx + 1 - start_idx
|
||||
end_pos := token.Position{
|
||||
...start_pos
|
||||
len: idx + 1 - start_idx
|
||||
}
|
||||
match hex_char_count {
|
||||
1...5 {}
|
||||
6 {
|
||||
first_digit := node.val[idx - 5] - 48
|
||||
second_digit := node.val[idx - 4] - 48
|
||||
if first_digit > 1 {
|
||||
c.error(checker.hex_lit_overflow_message, end_pos)
|
||||
} else if first_digit == 1 && second_digit > 0 {
|
||||
c.error(checker.hex_lit_overflow_message, end_pos)
|
||||
}
|
||||
}
|
||||
else {
|
||||
c.error(checker.hex_lit_overflow_message, end_pos)
|
||||
}
|
||||
c.error('hex character literal overflows string', end_pos)
|
||||
}
|
||||
idx++
|
||||
ch = node.val[idx] or { return ast.string_type }
|
||||
|
@ -1,4 +1,18 @@
|
||||
vlib/v/checker/tests/hex_literal_overflow.vv:1:35: error: hex character literal overflows string
|
||||
1 | s := 'this hex character literal, \xffffffff, should be caught by the checker'
|
||||
| ~~~~~~~
|
||||
2 | println(s)
|
||||
vlib/v/checker/tests/hex_literal_overflow.vv:1:7: error: hex character literal overflows string
|
||||
1 | a := '\x11ffff'
|
||||
| ~~~~~~~~
|
||||
2 | b := '\x20ffff'
|
||||
3 | c := '\x10fffff'
|
||||
vlib/v/checker/tests/hex_literal_overflow.vv:2:7: error: hex character literal overflows string
|
||||
1 | a := '\x11ffff'
|
||||
2 | b := '\x20ffff'
|
||||
| ~~~~~~~~
|
||||
3 | c := '\x10fffff'
|
||||
4 | println(a)
|
||||
vlib/v/checker/tests/hex_literal_overflow.vv:3:7: error: hex character literal overflows string
|
||||
1 | a := '\x11ffff'
|
||||
2 | b := '\x20ffff'
|
||||
3 | c := '\x10fffff'
|
||||
| ~~~~~~~~~
|
||||
4 | println(a)
|
||||
5 | println(b)
|
||||
|
@ -1,2 +1,6 @@
|
||||
s := 'this hex character literal, \xffffffff, should be caught by the checker'
|
||||
println(s)
|
||||
a := '\x11ffff'
|
||||
b := '\x20ffff'
|
||||
c := '\x10fffff'
|
||||
println(a)
|
||||
println(b)
|
||||
println(c)
|
||||
|
Loading…
Reference in New Issue
Block a user