diff options
| author | InKryption <inkryption07@gmail.com> | 2022-08-10 17:09:27 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-08-10 16:39:46 -0400 |
| commit | e218b7ea0c2a907c5728006b38e7ca492e19ccb6 (patch) | |
| tree | 636e5a1fc5fbe220cf29060c657b8719de78764f | |
| parent | 0e118ed0aca3d852d2499fa37d04adef62b03ead (diff) | |
| download | zig-e218b7ea0c2a907c5728006b38e7ca492e19ccb6.tar.gz zig-e218b7ea0c2a907c5728006b38e7ca492e19ccb6.zip | |
stage2: add compile error for invalid null/undefined pointer cast
| -rw-r--r-- | src/Sema.zig | 9 | ||||
| -rw-r--r-- | test/cases/compile_errors/compile_time_null_ptr_cast.zig | 11 | ||||
| -rw-r--r-- | test/cases/compile_errors/compile_time_undef_ptr_cast.zig | 11 |
3 files changed, 31 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 4fefff7c26..fe19de39dd 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -17272,6 +17272,15 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air else operand; + if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |operand_val| { + if (!dest_ty.ptrAllowsZero() and operand_val.isUndef()) { + return sema.failWithUseOfUndef(block, operand_src); + } + if (!dest_ty.ptrAllowsZero() and operand_val.isNull()) { + return sema.fail(block, operand_src, "null pointer casted to type {}", .{dest_ty.fmt(sema.mod)}); + } + } + const dest_elem_ty = dest_ty.elemType2(); try sema.resolveTypeLayout(block, dest_ty_src, dest_elem_ty); const dest_align = dest_ty.ptrAlignment(target); diff --git a/test/cases/compile_errors/compile_time_null_ptr_cast.zig b/test/cases/compile_errors/compile_time_null_ptr_cast.zig new file mode 100644 index 0000000000..d3750c8654 --- /dev/null +++ b/test/cases/compile_errors/compile_time_null_ptr_cast.zig @@ -0,0 +1,11 @@ +comptime { + var opt_ptr: ?*i32 = null; + const ptr = @ptrCast(*i32, opt_ptr); + _ = ptr; +} + +// error +// backend=llvm +// target=native +// +// :3:32: error: null pointer casted to type *i32 diff --git a/test/cases/compile_errors/compile_time_undef_ptr_cast.zig b/test/cases/compile_errors/compile_time_undef_ptr_cast.zig new file mode 100644 index 0000000000..14edd293de --- /dev/null +++ b/test/cases/compile_errors/compile_time_undef_ptr_cast.zig @@ -0,0 +1,11 @@ +comptime { + var undef_ptr: *i32 = undefined; + const ptr = @ptrCast(*i32, undef_ptr); + _ = ptr; +} + +// error +// backend=llvm +// target=native +// +// :3:32: error: use of undefined value here causes undefined behavior |
