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