From dddcf298026e188c173342a383eb8c71f31fe274 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Sun, 16 Nov 2025 13:28:43 +0800 Subject: [PATCH] checker: disallow deference of nil (fix #25740) (#25746) --- vlib/v/checker/checker.v | 3 +++ vlib/v/checker/tests/unsafe_deference_nil_err.out | 6 ++++++ vlib/v/checker/tests/unsafe_deference_nil_err.vv | 1 + 3 files changed, 10 insertions(+) create mode 100644 vlib/v/checker/tests/unsafe_deference_nil_err.out create mode 100644 vlib/v/checker/tests/unsafe_deference_nil_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index cee396f1e..4943f426e 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -5033,6 +5033,9 @@ fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type { if right_type.is_voidptr() { c.error('cannot dereference to void', node.pos) } + if right_type == ast.nil_type { + c.error('cannot deference a `nil` pointer', node.right.pos()) + } if mut expr is ast.Ident { if var := expr.scope.find_var('${expr.name}') { if var.expr is ast.UnsafeExpr { diff --git a/vlib/v/checker/tests/unsafe_deference_nil_err.out b/vlib/v/checker/tests/unsafe_deference_nil_err.out new file mode 100644 index 000000000..daefa7cea --- /dev/null +++ b/vlib/v/checker/tests/unsafe_deference_nil_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/unsafe_deference_nil_err.vv:1:1: warning: unused variable: `a` + 1 | a := unsafe { *nil } + | ^ +vlib/v/checker/tests/unsafe_deference_nil_err.vv:1:16: error: cannot deference a `nil` pointer + 1 | a := unsafe { *nil } + | ~~~ diff --git a/vlib/v/checker/tests/unsafe_deference_nil_err.vv b/vlib/v/checker/tests/unsafe_deference_nil_err.vv new file mode 100644 index 000000000..3af819d13 --- /dev/null +++ b/vlib/v/checker/tests/unsafe_deference_nil_err.vv @@ -0,0 +1 @@ +a := unsafe { *nil } -- 2.39.5