zig

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

commit f9b85c6e50e22153aff4c87e2ba943d68f24ee8c (tree)
parent 3d4eeafb47f97e5057d36fe2c3ed061cf0c70a63
Author: Michael Dusan <michael.dusan@gmail.com>
Date:   Mon, 18 Jan 2021 00:36:37 -0500

stage1: add error for slice.len incr beyond bounds

comptime direct slice.len increment dodges bounds checking but
we can emit an error for it, at least in the simple case.

- promote original assert to compile-error
- add test case

closes #7810

Diffstat:
Msrc/stage1/ir.cpp | 7++++---
Mtest/compile_errors.zig | 14++++++++++++++
2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp @@ -22655,9 +22655,10 @@ static IrInstGen *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstSrcElemP if (ptr_field->data.x_ptr.data.base_array.array_val->data.x_array.special != ConstArraySpecialBuf) { - ir_assert(new_index < - ptr_field->data.x_ptr.data.base_array.array_val->type->data.array.len, - &elem_ptr_instruction->base.base); + if (new_index >= ptr_field->data.x_ptr.data.base_array.array_val->type->data.array.len) { + ir_add_error(ira, &elem_ptr_instruction->base.base, buf_sprintf("out of bounds slice")); + return ira->codegen->invalid_inst_gen; + } } out_val->data.x_ptr.special = ConstPtrSpecialBaseArray; out_val->data.x_ptr.data.base_array.array_val = diff --git a/test/compile_errors.zig b/test/compile_errors.zig @@ -7981,6 +7981,20 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { "tmp.zig:7:37: note: referenced here", }); + // issue #7810 + cases.add("comptime slice-len increment beyond bounds", + \\export fn foo_slice_len_increment_beyond_bounds() void { + \\ comptime { + \\ var buf_storage: [8]u8 = undefined; + \\ var buf: []const u8 = buf_storage[0..]; + \\ buf.len += 1; + \\ buf[8] = 42; + \\ } + \\} + , &[_][]const u8{ + ":6:12: error: out of bounds slice", + }); + cases.add("comptime slice-sentinel is out of bounds (unterminated)", \\export fn foo_array() void { \\ comptime {