From bda7993bebf6c13d1c4f98269c80a2463f99e659 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 27 Mar 2022 20:31:54 +0300 Subject: [PATCH 1/3] Sema: fix error set memory unsafety All error names are supposed to be owned by Module. --- src/Sema.zig | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 4e0b57fbc66b0c7edc56795de1cd6cc0c96aa5ef..da98cb488d66322a4d7caf0a65a1727d5a253c1f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2317,8 +2317,8 @@ fn zirErrorSetDecl( const extra_index_end = extra_index + (extra.data.fields_len * 2); while (extra_index < extra_index_end) : (extra_index += 2) { // +2 to skip over doc_string const str_index = sema.code.extra[extra_index]; - const name = try new_decl_arena_allocator.dupe(u8, sema.code.nullTerminatedString(str_index)); - const result = names.getOrPutAssumeCapacity(name); + const kv = try sema.mod.getErrorValue(sema.code.nullTerminatedString(str_index)); + const result = names.getOrPutAssumeCapacity(kv.key); assert(!result.found_existing); // verified in AstGen } @@ -13113,11 +13113,10 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I // TODO use reflection instead of magic numbers here // error_set: type, const name_val = struct_val[0]; + const name_str = try name_val.toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena, target); - names.putAssumeCapacityNoClobber( - try name_val.toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena, target), - {}, - ); + const kv = try sema.mod.getErrorValue(name_str); + names.putAssumeCapacityNoClobber(kv.key, {}); } // names must be sorted -- 2.54.0 From 7217148edf28a0d3ab69b8c36b13d29c023e12fd Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 27 Mar 2022 21:05:42 +0300 Subject: [PATCH 2/3] Value: hash lazy_align --- build.zig | 3 ++- src/value.zig | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/build.zig b/build.zig index 5896ab1a8c9dafd2e769588172a23bedc1642ac1..7849245462b2fddf1271091ee23afa0c7488ca04 100644 --- a/build.zig +++ b/build.zig @@ -613,7 +613,8 @@ fn addCxxKnownPath( ctx.cxx_compiler, b.fmt("-print-file-name={s}", .{objname}), }); - const path_unpadded = mem.tokenize(u8, path_padded, "\r\n").next().?; + var tokenizer = mem.tokenize(u8, path_padded, "\r\n"); + const path_unpadded = tokenizer.next().?; if (mem.eql(u8, path_unpadded, objname)) { if (errtxt) |msg| { std.debug.print("{s}", .{msg}); diff --git a/src/value.zig b/src/value.zig index 0467f0362ce452611a6f59c376ee5fb47afb3f5c..926a52c2b710dd8e48ae1a925ba2ee51b8d5f917 100644 --- a/src/value.zig +++ b/src/value.zig @@ -461,7 +461,7 @@ pub const Value = extern union { => unreachable, .ty, .lazy_align => { - const payload = self.castTag(.ty).?; + const payload = self.cast(Payload.Ty).?; const new_payload = try arena.create(Payload.Ty); new_payload.* = .{ .base = payload.base, @@ -718,7 +718,7 @@ pub const Value = extern union { .lazy_align => { try out_stream.writeAll("@alignOf("); try val.castTag(.lazy_align).?.data.dump("", options, out_stream); - try out_stream.writeAll(")"); + return try out_stream.writeAll(")"); }, .int_type => { const int_type = val.castTag(.int_type).?.data; @@ -2478,6 +2478,13 @@ pub const Value = extern union { .the_only_possible_value, => return hashInt(ptr_val, hasher, target), + .lazy_align => { + // Bit weird to have this here but this function is also called + // on integers. + const ty = ptr_val.castTag(.lazy_align).?.data; + ty.hashWithHasher(hasher, target); + }, + else => unreachable, } } -- 2.54.0 From d5e89dd70b2b5e26e2457d276ce25125f111b29a Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 27 Mar 2022 22:52:28 +0300 Subject: [PATCH 3/3] stage2: add temporary workaround for lack of argument count check --- src/Sema.zig | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index da98cb488d66322a4d7caf0a65a1727d5a253c1f..a5b0804d9c34f3486c3b81ef05b2b59372ff4b6a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3661,8 +3661,12 @@ fn zirParamType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A fn_ty.fnInfo(); if (param_index >= fn_info.param_types.len) { - assert(fn_info.is_var_args); - return sema.addType(Type.initTag(.var_args_param)); + if (fn_info.is_var_args) { + return sema.addType(Type.initTag(.var_args_param)); + } + // TODO implement begin_call/end_call Zir instructions and check + // argument count before casting arguments to parameter types. + return sema.fail(block, callee_src, "wrong number of arguments", .{}); } if (fn_info.param_types[param_index].tag() == .generic_poison) { -- 2.54.0