zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 0ef4cc738b9c023c1128e3767919b446c959955a (tree)
parent d75fa86d7084bd41f68d1cd03763bd7cf2a87052
Author: Veikka Tuominen <git@vexu.eu>
Date:   Thu, 21 Jul 2022 15:57:04 +0300

Sema: check for zero length slices in `@alignCast` safety

Diffstat:
Msrc/Sema.zig | 7++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -16352,7 +16352,12 @@ fn zirAlignCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A const ptr_int = try block.addUnOp(.ptrtoint, actual_ptr); const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); - try sema.addSafetyCheck(block, is_aligned, .incorrect_alignment); + const ok = if (ptr_ty.isSlice()) ok: { + const len = try sema.analyzeSliceLen(block, ptr_src, ptr); + const len_zero = try block.addBinOp(.cmp_eq, len, try sema.addConstant(Type.usize, Value.zero)); + break :ok try block.addBinOp(.bit_or, len_zero, is_aligned); + } else is_aligned; + try sema.addSafetyCheck(block, ok, .incorrect_alignment); } return sema.coerceCompatiblePtrs(block, dest_ty, ptr, ptr_src); }