checker: add is_mut check for disallowing taking address of map's key and array's element outside unsafe (#6573)
parent
393889afa2
commit
aea52af9ae
|
@ -2754,13 +2754,20 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type {
|
||||||
}
|
}
|
||||||
if node.right is ast.IndexExpr as index {
|
if node.right is ast.IndexExpr as index {
|
||||||
typ_sym := c.table.get_type_symbol(index.left_type)
|
typ_sym := c.table.get_type_symbol(index.left_type)
|
||||||
if !c.inside_unsafe {
|
mut is_mut := false
|
||||||
|
if index.left is ast.Ident as ident {
|
||||||
|
if ident.obj is ast.Var {
|
||||||
|
v := ident.obj as ast.Var
|
||||||
|
is_mut = v.is_mut
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !c.inside_unsafe && is_mut {
|
||||||
if typ_sym.kind == .map {
|
if typ_sym.kind == .map {
|
||||||
c.error('cannot get address of map values outside unsafe blocks',
|
c.error('cannot take the address of mutable map values outside unsafe blocks',
|
||||||
index.pos)
|
index.pos)
|
||||||
}
|
}
|
||||||
if typ_sym.kind == .array {
|
if typ_sym.kind == .array {
|
||||||
c.error('cannot get address of array elements outside unsafe blocks',
|
c.error('cannot take the address of mutable array elements outside unsafe blocks',
|
||||||
index.pos)
|
index.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
vlib/v/checker/tests/array_get_element_address_err.vv:3:20: error: cannot get address of array elements outside unsafe blocks
|
|
||||||
1 | fn main() {
|
|
||||||
2 | arr_int := [int(23), 45, 7, 8]
|
|
||||||
3 | ele := &arr_int[1]
|
|
||||||
| ~~~
|
|
||||||
4 | println(ele)
|
|
||||||
5 | }
|
|
|
@ -1,14 +0,0 @@
|
||||||
vlib/v/checker/tests/map_get_value_address_err.vv:3:12: error: cannot get address of map values outside unsafe blocks
|
|
||||||
1 | fn main() {
|
|
||||||
2 | m := {'key' : 3}
|
|
||||||
3 | a := &m['key']
|
|
||||||
| ~~~~~~~
|
|
||||||
4 | b := &{'foo': 4}['foo']
|
|
||||||
5 | println(a)
|
|
||||||
vlib/v/checker/tests/map_get_value_address_err.vv:4:21: error: cannot get address of map values outside unsafe blocks
|
|
||||||
2 | m := {'key' : 3}
|
|
||||||
3 | a := &m['key']
|
|
||||||
4 | b := &{'foo': 4}['foo']
|
|
||||||
| ~~~~~~~
|
|
||||||
5 | println(a)
|
|
||||||
6 | println(b)
|
|
|
@ -1,7 +0,0 @@
|
||||||
fn main() {
|
|
||||||
m := {'key' : 3}
|
|
||||||
a := &m['key']
|
|
||||||
b := &{'foo': 4}['foo']
|
|
||||||
println(a)
|
|
||||||
println(b)
|
|
||||||
}
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
vlib/v/checker/tests/mut_array_get_element_address_err.vv:3:20: error: cannot take the address of mutable array elements outside unsafe blocks
|
||||||
|
1 | fn main() {
|
||||||
|
2 | mut arr_int := [int(23), 45, 7, 8]
|
||||||
|
3 | ele := &arr_int[1]
|
||||||
|
| ~~~
|
||||||
|
4 | println(ele)
|
||||||
|
5 | }
|
|
@ -1,5 +1,5 @@
|
||||||
fn main() {
|
fn main() {
|
||||||
arr_int := [int(23), 45, 7, 8]
|
mut arr_int := [int(23), 45, 7, 8]
|
||||||
ele := &arr_int[1]
|
ele := &arr_int[1]
|
||||||
println(ele)
|
println(ele)
|
||||||
}
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
vlib/v/checker/tests/mut_map_get_value_address_err.vv:3:12: error: cannot take the address of mutable map values outside unsafe blocks
|
||||||
|
1 | fn main() {
|
||||||
|
2 | mut m := {'key' : 3}
|
||||||
|
3 | a := &m['key']
|
||||||
|
| ~~~~~~~
|
||||||
|
4 | println(a)
|
||||||
|
5 | }
|
|
@ -0,0 +1,5 @@
|
||||||
|
fn main() {
|
||||||
|
mut m := {'key' : 3}
|
||||||
|
a := &m['key']
|
||||||
|
println(a)
|
||||||
|
}
|
|
@ -51,12 +51,10 @@ fn test_unsafe_if_stmt() int {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_map_address_index() {
|
fn test_map_address_index() {
|
||||||
m := {
|
mut m := {
|
||||||
'one': 1
|
'one': 1
|
||||||
}
|
}
|
||||||
unsafe {
|
mut one := unsafe {&m['one']}
|
||||||
mut one := &m['one']
|
(*one)++
|
||||||
one++
|
println(*one)
|
||||||
println(*one)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue