Skip to content

Commit ac58eca

Browse files
authored
checker: disallow deferencing a nil pointer (#18038)
1 parent f598bbd commit ac58eca

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

vlib/v/checker/checker.v

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3876,6 +3876,15 @@ fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type {
38763876
if right_type.is_voidptr() {
38773877
c.error('cannot dereference to void', node.pos)
38783878
}
3879+
if mut node.right is ast.Ident {
3880+
if var := node.right.scope.find_var('${node.right.name}') {
3881+
if var.expr is ast.UnsafeExpr {
3882+
if var.expr.expr is ast.Nil {
3883+
c.error('cannot deference a `nil` pointer', node.right.pos)
3884+
}
3885+
}
3886+
}
3887+
}
38793888
}
38803889
if node.op == .bit_not && !c.unwrap_generic(right_type).is_int() && !c.pref.translated
38813890
&& !c.file.is_translated {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
vlib/v/checker/tests/deference_nil_ptr_err.vv:3:10: error: cannot deference a `nil` pointer
2+
1 | foo_ptr := unsafe { nil }
3+
2 |
4+
3 | println(*foo_ptr)
5+
| ~~~~~~~
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
foo_ptr := unsafe { nil }
2+
3+
println(*foo_ptr)

0 commit comments

Comments
 (0)