zig

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

commit 5df6c70a32c474954b550f1c7deb61dc87f0810e (tree)
parent 774487038fa46a656d308d6686c5b3df757224cb
Author: Brandon Botsch <brandon.botsch@gmail.com>
Date:   Sat, 24 Feb 2024 00:56:00 -0500

std.hash_map: Fix integer overflow bugs (#19048)


Diffstat:
Mlib/std/hash_map.zig | 11++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/lib/std/hash_map.zig b/lib/std/hash_map.zig @@ -894,7 +894,7 @@ pub fn HashMapUnmanaged( } fn capacityForSize(size: Size) Size { - var new_cap: u32 = @truncate((@as(u64, size) * 100) / max_load_percentage + 1); + var new_cap: u32 = @intCast((@as(u64, size) * 100) / max_load_percentage + 1); new_cap = math.ceilPowerOfTwo(u32, new_cap) catch unreachable; return new_cap; } @@ -1537,14 +1537,15 @@ pub fn HashMapUnmanaged( const val_align = if (@sizeOf(V) == 0) 1 else @alignOf(V); const max_align = comptime @max(header_align, key_align, val_align); - const meta_size = @sizeOf(Header) + new_capacity * @sizeOf(Metadata); + const new_cap: usize = new_capacity; + const meta_size = @sizeOf(Header) + new_cap * @sizeOf(Metadata); comptime assert(@alignOf(Metadata) == 1); const keys_start = std.mem.alignForward(usize, meta_size, key_align); - const keys_end = keys_start + new_capacity * @sizeOf(K); + const keys_end = keys_start + new_cap * @sizeOf(K); const vals_start = std.mem.alignForward(usize, keys_end, val_align); - const vals_end = vals_start + new_capacity * @sizeOf(V); + const vals_end = vals_start + new_cap * @sizeOf(V); const total_size = std.mem.alignForward(usize, vals_end, max_align); @@ -1572,7 +1573,7 @@ pub fn HashMapUnmanaged( const val_align = if (@sizeOf(V) == 0) 1 else @alignOf(V); const max_align = comptime @max(header_align, key_align, val_align); - const cap = self.capacity(); + const cap: usize = self.capacity(); const meta_size = @sizeOf(Header) + cap * @sizeOf(Metadata); comptime assert(@alignOf(Metadata) == 1);