aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-07-21 15:57:04 +0300
committerVeikka Tuominen <git@vexu.eu>2022-07-23 15:40:12 +0300
commit0ef4cc738b9c023c1128e3767919b446c959955a (patch)
tree9ae16a9947b984805d5c0316b9a42e0de3f254cc
parentd75fa86d7084bd41f68d1cd03763bd7cf2a87052 (diff)
downloadzig-0ef4cc738b9c023c1128e3767919b446c959955a.tar.gz
zig-0ef4cc738b9c023c1128e3767919b446c959955a.zip
Sema: check for zero length slices in `@alignCast` safety
-rw-r--r--src/Sema.zig7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 7aaff7043f..fd630e88bf 100644
--- 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);
}