1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

checker: require unsafe for accessing a pointer map value

This commit is contained in:
Alexander Medvednikov 2023-01-15 02:33:51 +01:00
parent b25c9e8bbf
commit 877a1e511a
2 changed files with 18 additions and 3 deletions

View File

@ -3812,6 +3812,15 @@ fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
'(note, that variables may be mutable but string values are always immutable, like in Go and Java)', '(note, that variables may be mutable but string values are always immutable, like in Go and Java)',
node.pos) node.pos)
} }
if !c.inside_unsafe && !c.is_builtin_mod && typ_sym.kind == .map && node.or_expr.stmts.len == 0 {
elem_type := c.table.value_type(typ)
if elem_type.is_real_pointer() {
c.note('accessing a pointer map value requires an `or{}` block outside `unsafe`',
node.pos)
}
}
if (typ.is_ptr() && !typ.has_flag(.shared_f) && !node.left.is_auto_deref_var()) if (typ.is_ptr() && !typ.has_flag(.shared_f) && !node.left.is_auto_deref_var())
|| typ.is_pointer() { || typ.is_pointer() {
mut is_ok := false mut is_ok := false

View File

@ -2007,7 +2007,9 @@ fn (mut g Gen) stmt(node ast.Stmt) {
save_inner_loop := g.inner_loop save_inner_loop := g.inner_loop
g.inner_loop = unsafe { &node } g.inner_loop = unsafe { &node }
if node.label != '' { if node.label != '' {
g.labeled_loops[node.label] = unsafe { &node } unsafe {
g.labeled_loops[node.label] = &node
}
} }
g.write_v_source_line_info(node.pos) g.write_v_source_line_info(node.pos)
g.for_c_stmt(node) g.for_c_stmt(node)
@ -2021,7 +2023,9 @@ fn (mut g Gen) stmt(node ast.Stmt) {
save_inner_loop := g.inner_loop save_inner_loop := g.inner_loop
g.inner_loop = unsafe { &node } g.inner_loop = unsafe { &node }
if node.label != '' { if node.label != '' {
g.labeled_loops[node.label] = unsafe { &node } unsafe {
g.labeled_loops[node.label] = &node
}
} }
g.write_v_source_line_info(node.pos) g.write_v_source_line_info(node.pos)
g.for_in_stmt(node) g.for_in_stmt(node)
@ -2035,7 +2039,9 @@ fn (mut g Gen) stmt(node ast.Stmt) {
save_inner_loop := g.inner_loop save_inner_loop := g.inner_loop
g.inner_loop = unsafe { &node } g.inner_loop = unsafe { &node }
if node.label != '' { if node.label != '' {
g.labeled_loops[node.label] = unsafe { &node } unsafe {
g.labeled_loops[node.label] = &node
}
} }
g.write_v_source_line_info(node.pos) g.write_v_source_line_info(node.pos)
g.for_stmt(node) g.for_stmt(node)