Commit 135f4791e5

LemonBoy <thatlemon@gmail.com>
2020-12-17 12:00:48
std: Don't hash undefined bits
auto_hash must be extra careful when hashing integers whose bit size is not a multiple of 8 as, when reinterpreted with mem.asBytes, may contain undefined non-zero bits too.
1 parent 9e58692
Changed files (1)
lib
std
lib/std/hash/auto_hash.zig
@@ -99,7 +99,16 @@ pub fn hash(hasher: anytype, key: anytype, comptime strat: HashStrategy) void {
 
         // Help the optimizer see that hashing an int is easy by inlining!
         // TODO Check if the situation is better after #561 is resolved.
-        .Int => @call(.{ .modifier = .always_inline }, hasher.update, .{std.mem.asBytes(&key)}),
+        .Int => {
+            if (comptime meta.trait.hasUniqueRepresentation(Key)) {
+                @call(.{ .modifier = .always_inline }, hasher.update, .{std.mem.asBytes(&key)});
+            } else {
+                // Take only the part containing the key value, the remaining
+                // bytes are undefined and must not be hashed!
+                const byte_size = comptime std.math.divCeil(comptime_int, @bitSizeOf(Key), 8) catch unreachable;
+                @call(.{ .modifier = .always_inline }, hasher.update, .{std.mem.asBytes(&key)[0..byte_size]});
+            }
+        },
 
         .Bool => hash(hasher, @boolToInt(key), strat),
         .Enum => hash(hasher, @enumToInt(key), strat),