authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2023-01-22 17:34:38+01:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2023-01-23 12:19:53+01:00
logfaf2fd18d33de246c5bb03905f25290108e1dd30
tree76549a3a52ed3d3dac3fd8f62d92a1e90e95c721
parentc0284e242f7d78955204dc8a627fecd45aa5e521
signaturelock-open Commit is signed but in an unrecognized format.

std: eliminate pointless meta.assumeSentinel() usage

This fixes a bug in std.net caused during the introduction of meta.assumeSentinel due to the unfortunate semantics of mem.span() This leaves only 3 remaining uses of meta.assumeSentinel() in the standard library, each of which could be a simple @ptrCast([*:0]T, foo) instead. I think this function should likely be removed.

8 files changed, 17 insertions(+), 19 deletions(-)

lib/std/debug.zig+1-1
...@@ -978,7 +978,7 @@ pub fn readElfDebugInfo(allocator: mem.Allocator, elf_file: File) !ModuleDebugIn...@@ -978,7 +978,7 @@ pub fn readElfDebugInfo(allocator: mem.Allocator, elf_file: File) !ModuleDebugIn
978 for (shdrs) |*shdr| {978 for (shdrs) |*shdr| {
979 if (shdr.sh_type == elf.SHT_NULL) continue;979 if (shdr.sh_type == elf.SHT_NULL) continue;
980980
981 const name = std.mem.span(std.meta.assumeSentinel(header_strings[shdr.sh_name..].ptr, 0));981 const name = mem.sliceTo(header_strings[shdr.sh_name..], 0);
982 if (mem.eql(u8, name, ".debug_info")) {982 if (mem.eql(u8, name, ".debug_info")) {
983 opt_debug_info = try chopSlice(mapped_mem, shdr.sh_offset, shdr.sh_size);983 opt_debug_info = try chopSlice(mapped_mem, shdr.sh_offset, shdr.sh_size);
984 } else if (mem.eql(u8, name, ".debug_abbrev")) {984 } else if (mem.eql(u8, name, ".debug_abbrev")) {
lib/std/fs.zig+2-2
...@@ -2968,14 +2968,14 @@ pub fn selfExePath(out_buffer: []u8) SelfExePathError![]u8 {...@@ -2968,14 +2968,14 @@ pub fn selfExePath(out_buffer: []u8) SelfExePathError![]u8 {
2968 var out_len: usize = out_buffer.len;2968 var out_len: usize = out_buffer.len;
2969 try os.sysctl(&mib, out_buffer.ptr, &out_len, null, 0);2969 try os.sysctl(&mib, out_buffer.ptr, &out_len, null, 0);
2970 // TODO could this slice from 0 to out_len instead?2970 // TODO could this slice from 0 to out_len instead?
2971 return mem.sliceTo(std.meta.assumeSentinel(out_buffer.ptr, 0), 0);2971 return mem.sliceTo(out_buffer, 0);
2972 },2972 },
2973 .netbsd => {2973 .netbsd => {
2974 var mib = [4]c_int{ os.CTL.KERN, os.KERN.PROC_ARGS, -1, os.KERN.PROC_PATHNAME };2974 var mib = [4]c_int{ os.CTL.KERN, os.KERN.PROC_ARGS, -1, os.KERN.PROC_PATHNAME };
2975 var out_len: usize = out_buffer.len;2975 var out_len: usize = out_buffer.len;
2976 try os.sysctl(&mib, out_buffer.ptr, &out_len, null, 0);2976 try os.sysctl(&mib, out_buffer.ptr, &out_len, null, 0);
2977 // TODO could this slice from 0 to out_len instead?2977 // TODO could this slice from 0 to out_len instead?
2978 return mem.sliceTo(std.meta.assumeSentinel(out_buffer.ptr, 0), 0);2978 return mem.sliceTo(out_buffer, 0);
2979 },2979 },
2980 .openbsd, .haiku => {2980 .openbsd, .haiku => {
2981 // OpenBSD doesn't support getting the path of a running process, so try to guess it2981 // OpenBSD doesn't support getting the path of a running process, so try to guess it
lib/std/net.zig+1-1
...@@ -1687,7 +1687,7 @@ fn dnsParseCallback(ctx: dpc_ctx, rr: u8, data: []const u8, packet: []const u8)...@@ -1687,7 +1687,7 @@ fn dnsParseCallback(ctx: dpc_ctx, rr: u8, data: []const u8, packet: []const u8)
1687 var tmp: [256]u8 = undefined;1687 var tmp: [256]u8 = undefined;
1688 // Returns len of compressed name. strlen to get canon name.1688 // Returns len of compressed name. strlen to get canon name.
1689 _ = try os.dn_expand(packet, data, &tmp);1689 _ = try os.dn_expand(packet, data, &tmp);
1690 const canon_name = mem.sliceTo(std.meta.assumeSentinel(&tmp, 0), 0);1690 const canon_name = mem.sliceTo(&tmp, 0);
1691 if (isValidHostName(canon_name)) {1691 if (isValidHostName(canon_name)) {
1692 ctx.canon.items.len = 0;1692 ctx.canon.items.len = 0;
1693 try ctx.canon.appendSlice(canon_name);1693 try ctx.canon.appendSlice(canon_name);
lib/std/os.zig+7-7
...@@ -1977,7 +1977,7 @@ pub fn getcwd(out_buffer: []u8) GetCwdError![]u8 {...@@ -1977,7 +1977,7 @@ pub fn getcwd(out_buffer: []u8) GetCwdError![]u8 {
1977 break :blk errno(system.getcwd(out_buffer.ptr, out_buffer.len));1977 break :blk errno(system.getcwd(out_buffer.ptr, out_buffer.len));
1978 };1978 };
1979 switch (err) {1979 switch (err) {
1980 .SUCCESS => return mem.sliceTo(std.meta.assumeSentinel(out_buffer.ptr, 0), 0),1980 .SUCCESS => return mem.sliceTo(out_buffer, 0),
1981 .FAULT => unreachable,1981 .FAULT => unreachable,
1982 .INVAL => unreachable,1982 .INVAL => unreachable,
1983 .NOENT => return error.CurrentWorkingDirectoryUnlinked,1983 .NOENT => return error.CurrentWorkingDirectoryUnlinked,
...@@ -5131,10 +5131,10 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 {...@@ -5131,10 +5131,10 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 {
5131 return out_buffer[0..len];5131 return out_buffer[0..len];
5132 },5132 },
5133 .linux => {5133 .linux => {
5134 var procfs_buf: ["/proc/self/fd/-2147483648".len:0]u8 = undefined;5134 var procfs_buf: ["/proc/self/fd/-2147483648\x00".len]u8 = undefined;
5135 const proc_path = std.fmt.bufPrint(procfs_buf[0..], "/proc/self/fd/{d}\x00", .{fd}) catch unreachable;5135 const proc_path = std.fmt.bufPrintZ(procfs_buf[0..], "/proc/self/fd/{d}", .{fd}) catch unreachable;
51365136
5137 const target = readlinkZ(std.meta.assumeSentinel(proc_path.ptr, 0), out_buffer) catch |err| {5137 const target = readlinkZ(proc_path, out_buffer) catch |err| {
5138 switch (err) {5138 switch (err) {
5139 error.UnsupportedReparsePointType => unreachable, // Windows only,5139 error.UnsupportedReparsePointType => unreachable, // Windows only,
5140 error.NotLink => unreachable,5140 error.NotLink => unreachable,
...@@ -5144,7 +5144,7 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 {...@@ -5144,7 +5144,7 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) RealPathError![]u8 {
5144 return target;5144 return target;
5145 },5145 },
5146 .solaris => {5146 .solaris => {
5147 var procfs_buf: ["/proc/self/path/-2147483648".len:0]u8 = undefined;5147 var procfs_buf: ["/proc/self/path/-2147483648\x00".len]u8 = undefined;
5148 const proc_path = std.fmt.bufPrintZ(procfs_buf[0..], "/proc/self/path/{d}", .{fd}) catch unreachable;5148 const proc_path = std.fmt.bufPrintZ(procfs_buf[0..], "/proc/self/path/{d}", .{fd}) catch unreachable;
51495149
5150 const target = readlinkZ(proc_path, out_buffer) catch |err| switch (err) {5150 const target = readlinkZ(proc_path, out_buffer) catch |err| switch (err) {
...@@ -5561,7 +5561,7 @@ pub const GetHostNameError = error{PermissionDenied} || UnexpectedError;...@@ -5561,7 +5561,7 @@ pub const GetHostNameError = error{PermissionDenied} || UnexpectedError;
5561pub fn gethostname(name_buffer: *[HOST_NAME_MAX]u8) GetHostNameError![]u8 {5561pub fn gethostname(name_buffer: *[HOST_NAME_MAX]u8) GetHostNameError![]u8 {
5562 if (builtin.link_libc) {5562 if (builtin.link_libc) {
5563 switch (errno(system.gethostname(name_buffer, name_buffer.len))) {5563 switch (errno(system.gethostname(name_buffer, name_buffer.len))) {
5564 .SUCCESS => return mem.sliceTo(std.meta.assumeSentinel(name_buffer, 0), 0),5564 .SUCCESS => return mem.sliceTo(name_buffer, 0),
5565 .FAULT => unreachable,5565 .FAULT => unreachable,
5566 .NAMETOOLONG => unreachable, // HOST_NAME_MAX prevents this5566 .NAMETOOLONG => unreachable, // HOST_NAME_MAX prevents this
5567 .PERM => return error.PermissionDenied,5567 .PERM => return error.PermissionDenied,
...@@ -5570,7 +5570,7 @@ pub fn gethostname(name_buffer: *[HOST_NAME_MAX]u8) GetHostNameError![]u8 {...@@ -5570,7 +5570,7 @@ pub fn gethostname(name_buffer: *[HOST_NAME_MAX]u8) GetHostNameError![]u8 {
5570 }5570 }
5571 if (builtin.os.tag == .linux) {5571 if (builtin.os.tag == .linux) {
5572 const uts = uname();5572 const uts = uname();
5573 const hostname = mem.sliceTo(std.meta.assumeSentinel(&uts.nodename, 0), 0);5573 const hostname = mem.sliceTo(&uts.nodename, 0);
5574 mem.copy(u8, name_buffer, hostname);5574 mem.copy(u8, name_buffer, hostname);
5575 return name_buffer[0..hostname.len];5575 return name_buffer[0..hostname.len];
5576 }5576 }
lib/std/os/windows.zig+1-1
...@@ -2006,7 +2006,7 @@ pub fn sliceToPrefixedFileW(s: []const u8) !PathSpace {...@@ -2006,7 +2006,7 @@ pub fn sliceToPrefixedFileW(s: []const u8) !PathSpace {
2006}2006}
20072007
2008fn getFullPathNameW(path: [*:0]const u16, out: []u16) !usize {2008fn getFullPathNameW(path: [*:0]const u16, out: []u16) !usize {
2009 const result = kernel32.GetFullPathNameW(path, @intCast(u32, out.len), std.meta.assumeSentinel(out.ptr, 0), null);2009 const result = kernel32.GetFullPathNameW(path, @intCast(u32, out.len), out.ptr, null);
2010 if (result == 0) {2010 if (result == 0) {
2011 switch (kernel32.GetLastError()) {2011 switch (kernel32.GetLastError()) {
2012 else => |err| return unexpectedError(err),2012 else => |err| return unexpectedError(err),
lib/std/os/windows/kernel32.zig+1-1
...@@ -223,7 +223,7 @@ pub extern "kernel32" fn GetFinalPathNameByHandleW(...@@ -223,7 +223,7 @@ pub extern "kernel32" fn GetFinalPathNameByHandleW(
223pub extern "kernel32" fn GetFullPathNameW(223pub extern "kernel32" fn GetFullPathNameW(
224 lpFileName: [*:0]const u16,224 lpFileName: [*:0]const u16,
225 nBufferLength: u32,225 nBufferLength: u32,
226 lpBuffer: ?[*:0]u16,226 lpBuffer: [*]u16,
227 lpFilePart: ?*?[*:0]u16,227 lpFilePart: ?*?[*:0]u16,
228) callconv(@import("std").os.windows.WINAPI) u32;228) callconv(@import("std").os.windows.WINAPI) u32;
229229
lib/std/pdb.zig+1-1
...@@ -671,7 +671,7 @@ pub const Pdb = struct {...@@ -671,7 +671,7 @@ pub const Pdb = struct {
671 const name_index = try reader.readIntLittle(u32);671 const name_index = try reader.readIntLittle(u32);
672 if (name_offset > name_bytes.len)672 if (name_offset > name_bytes.len)
673 return error.InvalidDebugInfo;673 return error.InvalidDebugInfo;
674 const name = mem.sliceTo(std.meta.assumeSentinel(name_bytes.ptr + name_offset, 0), 0);674 const name = mem.sliceTo(name_bytes[name_offset..], 0);
675 if (mem.eql(u8, name, "/names")) {675 if (mem.eql(u8, name, "/names")) {
676 break :str_tab_index name_index;676 break :str_tab_index name_index;
677 }677 }
lib/std/zig/system/NativeTargetInfo.zig+3-5
...@@ -533,8 +533,7 @@ fn glibcVerFromSoFile(file: fs.File) !std.builtin.Version {...@@ -533,8 +533,7 @@ fn glibcVerFromSoFile(file: fs.File) !std.builtin.Version {
533 @alignCast(@alignOf(elf.Elf64_Shdr), &sh_buf[sh_buf_i]),533 @alignCast(@alignOf(elf.Elf64_Shdr), &sh_buf[sh_buf_i]),
534 );534 );
535 const sh_name_off = elfInt(is_64, need_bswap, sh32.sh_name, sh64.sh_name);535 const sh_name_off = elfInt(is_64, need_bswap, sh32.sh_name, sh64.sh_name);
536 // TODO this pointer cast should not be necessary536 const sh_name = mem.sliceTo(shstrtab[sh_name_off..], 0);
537 const sh_name = mem.sliceTo(std.meta.assumeSentinel(shstrtab[sh_name_off..].ptr, 0), 0);
538 if (mem.eql(u8, sh_name, ".dynstr")) {537 if (mem.eql(u8, sh_name, ".dynstr")) {
539 break :find_dyn_str .{538 break :find_dyn_str .{
540 .offset = elfInt(is_64, need_bswap, sh32.sh_offset, sh64.sh_offset),539 .offset = elfInt(is_64, need_bswap, sh32.sh_offset, sh64.sh_offset),
...@@ -789,8 +788,7 @@ pub fn abiAndDynamicLinkerFromFile(...@@ -789,8 +788,7 @@ pub fn abiAndDynamicLinkerFromFile(
789 @alignCast(@alignOf(elf.Elf64_Shdr), &sh_buf[sh_buf_i]),788 @alignCast(@alignOf(elf.Elf64_Shdr), &sh_buf[sh_buf_i]),
790 );789 );
791 const sh_name_off = elfInt(is_64, need_bswap, sh32.sh_name, sh64.sh_name);790 const sh_name_off = elfInt(is_64, need_bswap, sh32.sh_name, sh64.sh_name);
792 // TODO this pointer cast should not be necessary791 const sh_name = mem.sliceTo(shstrtab[sh_name_off..], 0);
793 const sh_name = mem.sliceTo(std.meta.assumeSentinel(shstrtab[sh_name_off..].ptr, 0), 0);
794 if (mem.eql(u8, sh_name, ".dynstr")) {792 if (mem.eql(u8, sh_name, ".dynstr")) {
795 break :find_dyn_str .{793 break :find_dyn_str .{
796 .offset = elfInt(is_64, need_bswap, sh32.sh_offset, sh64.sh_offset),794 .offset = elfInt(is_64, need_bswap, sh32.sh_offset, sh64.sh_offset),
...@@ -812,7 +810,7 @@ pub fn abiAndDynamicLinkerFromFile(...@@ -812,7 +810,7 @@ pub fn abiAndDynamicLinkerFromFile(
812 const strtab_read_len = try preadMin(file, &strtab_buf, rpoff_file, strtab_len);810 const strtab_read_len = try preadMin(file, &strtab_buf, rpoff_file, strtab_len);
813 const strtab = strtab_buf[0..strtab_read_len];811 const strtab = strtab_buf[0..strtab_read_len];
814812
815 const rpath_list = mem.sliceTo(std.meta.assumeSentinel(strtab.ptr, 0), 0);813 const rpath_list = mem.sliceTo(strtab, 0);
816 var it = mem.tokenize(u8, rpath_list, ":");814 var it = mem.tokenize(u8, rpath_list, ":");
817 while (it.next()) |rpath| {815 while (it.next()) |rpath| {
818 if (glibcVerFromRPath(rpath)) |ver| {816 if (glibcVerFromRPath(rpath)) |ver| {