From 158d98a7f2b270b12e79dcd94a4c0f82b158e3b3 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 14 Jan 2020 21:13:55 +0100 Subject: [PATCH 1/4] Print sentinel value in ir_print --- src/ir_print.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ir_print.cpp b/src/ir_print.cpp index 3b90e7c80b9de2ae06ccabe7f0f1e063d9e0ccb9..90ab410e4d6e31b4e9cef63934fa4e7deee15b36 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -930,6 +930,10 @@ static void ir_print_set_float_mode(IrPrint *irp, IrInstructionSetFloatMode *ins static void ir_print_array_type(IrPrint *irp, IrInstructionArrayType *instruction) { fprintf(irp->f, "["); ir_print_other_instruction(irp, instruction->size); + if (instruction->sentinel != nullptr) { + fprintf(irp->f, ":"); + ir_print_other_instruction(irp, instruction->sentinel); + } fprintf(irp->f, "]"); ir_print_other_instruction(irp, instruction->child_type); } -- 2.54.0 From c1f3766f1c1a528ff24c24429298ff8ac162909f Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 14 Jan 2020 21:15:33 +0100 Subject: [PATCH 2/4] Correct dlpi_name field type --- lib/std/os/bits/dragonfly.zig | 2 +- lib/std/os/bits/freebsd.zig | 2 +- lib/std/os/bits/linux.zig | 2 +- lib/std/os/bits/netbsd.zig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/std/os/bits/dragonfly.zig b/lib/std/os/bits/dragonfly.zig index a7f8f757190395dbbd281377adfa7baeb947e844..750ca9dff0b82e54d528252c50568241fe92ce5f 100644 --- a/lib/std/os/bits/dragonfly.zig +++ b/lib/std/os/bits/dragonfly.zig @@ -612,7 +612,7 @@ pub const sockaddr_storage = extern struct { }; pub const dl_phdr_info = extern struct { dlpi_addr: usize, - dlpi_name: ?[*]const u8, + dlpi_name: ?[*:0]const u8, dlpi_phdr: [*]std.elf.Phdr, dlpi_phnum: u16, }; diff --git a/lib/std/os/bits/freebsd.zig b/lib/std/os/bits/freebsd.zig index a95de9d71ede59ed366549ca22e3691a15ed813c..66540433e4dc10c10a40060b9f7e56e649e8d698 100644 --- a/lib/std/os/bits/freebsd.zig +++ b/lib/std/os/bits/freebsd.zig @@ -45,7 +45,7 @@ pub const RTLD_NOLOAD = 0x02000; pub const dl_phdr_info = extern struct { dlpi_addr: usize, - dlpi_name: ?[*]const u8, + dlpi_name: ?[*:0]const u8, dlpi_phdr: [*]std.elf.Phdr, dlpi_phnum: u16, }; diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig index 678868a2c3fa897fc9aa9b97c623e2e069585c57..51ea49005e20d858d5ee16fb5de19898687c6f97 100644 --- a/lib/std/os/bits/linux.zig +++ b/lib/std/os/bits/linux.zig @@ -992,7 +992,7 @@ pub const dirent64 = extern struct { pub const dl_phdr_info = extern struct { dlpi_addr: usize, - dlpi_name: ?[*]const u8, + dlpi_name: ?[*:0]const u8, dlpi_phdr: [*]std.elf.Phdr, dlpi_phnum: u16, }; diff --git a/lib/std/os/bits/netbsd.zig b/lib/std/os/bits/netbsd.zig index de1d72eca265afd66ebb41f6ac7caa43ad111d4d..2f2494d4ce4cc3a4494668d4ffd7799abe42adf2 100644 --- a/lib/std/os/bits/netbsd.zig +++ b/lib/std/os/bits/netbsd.zig @@ -16,7 +16,7 @@ pub const Kevent = extern struct { pub const dl_phdr_info = extern struct { dlpi_addr: usize, - dlpi_name: ?[*]const u8, + dlpi_name: ?[*:0]const u8, dlpi_phdr: [*]std.elf.Phdr, dlpi_phnum: u16, }; -- 2.54.0 From 49771f356fddda873405da2cc6aaffb2758abcbc Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 14 Jan 2020 21:23:11 +0100 Subject: [PATCH 3/4] Make sure @export symbol name is not empty --- src/ir.cpp | 6 ++++++ test/compile_errors.zig | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/ir.cpp b/src/ir.cpp index bbf56fd08dc79ff785b5042e93dde5a52b04504a..d871aa27a08f09e45e93feb30f24c5eb8390e7f8 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -16766,6 +16766,12 @@ static IrInstruction *ir_analyze_instruction_export(IrAnalyze *ira, IrInstructio if (!symbol_name) return ira->codegen->invalid_instruction; + if (buf_len(symbol_name) < 1) { + ir_add_error(ira, name_inst, + buf_sprintf("exported symbol name cannot be empty")); + return ira->codegen->invalid_instruction; + } + GlobalLinkageId global_linkage_id; if (!ir_resolve_global_linkage(ira, linkage_inst, &global_linkage_id)) return ira->codegen->invalid_instruction; diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 6552ad241302c7710eac65af504841842768fe84..3ce5bd88019c13b1ebd5018bf7d2e5c3205b620b 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -2,6 +2,15 @@ const tests = @import("tests.zig"); const builtin = @import("builtin"); pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.addTest("@export with empty name string", + \\pub export fn entry() void { } + \\comptime { + \\ @export(entry, .{ .name = "" }); + \\} + , &[_][]const u8{ + "tmp.zig:3:5: error: exported symbol name cannot be empty", + }); + cases.addTest("switch ranges endpoints are validated", \\pub export fn entry() void { \\ var x: i32 = 0; -- 2.54.0 From c85afff5a82c2d67d12a85723bb73ec5368bf590 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 14 Jan 2020 23:11:10 +0100 Subject: [PATCH 4/4] Correct l_name field type --- lib/std/dynamic_library.zig | 2 +- lib/std/os/linux.zig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/std/dynamic_library.zig b/lib/std/dynamic_library.zig index 31f83833a49f39ae2a9f43af7e2ab03a6643d2f0..db912ec92296b11ab8e50aba034f261d7c9dfc28 100644 --- a/lib/std/dynamic_library.zig +++ b/lib/std/dynamic_library.zig @@ -24,7 +24,7 @@ pub const DynLib = switch (builtin.os) { // fashion. const LinkMap = extern struct { l_addr: usize, - l_name: [*]const u8, + l_name: [*:0]const u8, l_ld: ?*elf.Dyn, l_next: ?*LinkMap, l_prev: ?*LinkMap, diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 94fad4cfb7f54cb13ecc63a5c0a68711011bea7f..fcc1e62489c23c68b12b96404f80d08b3728f3a1 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1042,7 +1042,7 @@ pub fn uname(uts: *utsname) usize { } // XXX: This should be weak -extern const __ehdr_start: elf.Ehdr = undefined; +extern const __ehdr_start: elf.Ehdr; pub fn dl_iterate_phdr(comptime T: type, callback: extern fn (info: *dl_phdr_info, size: usize, data: ?*T) i32, data: ?*T) isize { if (builtin.link_libc) { -- 2.54.0