From cc56577edfadd7685de7fb14c013c5e3a69c28ce Mon Sep 17 00:00:00 2001 From: Michael Bradshaw Date: Fri, 20 Oct 2023 07:20:01 -0600 Subject: [PATCH] Return zero for NaN-to-int lossy casts Fixes #15038. The goal here is to guarantee lossyCast() is panic-free and always safe. --- lib/std/math.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/std/math.zig b/lib/std/math.zig index 336007be57..817a98f314 100644 --- a/lib/std/math.zig +++ b/lib/std/math.zig @@ -1214,7 +1214,9 @@ pub fn lossyCast(comptime T: type, value: anytype) T { } }, .Float, .ComptimeFloat => { - if (value >= maxInt(T)) { + if (isNan(value)) { + return 0; + } else if (value >= maxInt(T)) { return @as(T, maxInt(T)); } else if (value <= minInt(T)) { return @as(T, minInt(T)); @@ -1234,6 +1236,7 @@ test "lossyCast" { try testing.expect(lossyCast(u32, @as(i16, -255)) == @as(u32, 0)); try testing.expect(lossyCast(i9, @as(u32, 200)) == @as(i9, 200)); try testing.expect(lossyCast(u32, @as(f32, maxInt(u32))) == maxInt(u32)); + try testing.expect(lossyCast(u32, nan(f32)) == 0); } /// Performs linear interpolation between *a* and *b* based on *t*.