authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-21 15:57:04+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-23 15:40:12+03:00
log0ef4cc738b9c023c1128e3767919b446c959955a
tree9ae16a9947b984805d5c0316b9a42e0de3f254cc
parentd75fa86d7084bd41f68d1cd03763bd7cf2a87052

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


1 files changed, 6 insertions(+), 1 deletions(-)

src/Sema.zig+6-1
......@@ -16352,7 +16352,12 @@ fn zirAlignCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
1635216352 const ptr_int = try block.addUnOp(.ptrtoint, actual_ptr);
1635316353 const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1);
1635416354 const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize);
16355 try sema.addSafetyCheck(block, is_aligned, .incorrect_alignment);
16355 const ok = if (ptr_ty.isSlice()) ok: {
16356 const len = try sema.analyzeSliceLen(block, ptr_src, ptr);
16357 const len_zero = try block.addBinOp(.cmp_eq, len, try sema.addConstant(Type.usize, Value.zero));
16358 break :ok try block.addBinOp(.bit_or, len_zero, is_aligned);
16359 } else is_aligned;
16360 try sema.addSafetyCheck(block, ok, .incorrect_alignment);
1635616361 }
1635716362 return sema.coerceCompatiblePtrs(block, dest_ty, ptr, ptr_src);
1635816363}