Detect and replace NaNs in cXyz default ctor

This fixes intermittent segfaults due to invalid atan table lookups.

For some reason zero-initializing all cXyz objects causes issues, as
does initializing them with INFINITY or -INFINITY. However, at least
one of the possible crashes (in d_a_e_yg's search_ground_1) is
guaranteed to happen whenever a specific uninitialized cXyz contains
a NaN for x or z.

A possible explanation for these crashes not occurring on hardware might
be that the problematic objects happen to be placed at memory locations
that happen to never contain a NaN upon allocation, so the buggy code
was never caught. Further investigation would be needed to determine if
this is what's actually happening, though.
This commit is contained in:
Max Roncace
2026-03-25 20:29:39 -04:00
parent 816d853002
commit 7d3795f745
+11 -1
View File
@@ -31,7 +31,17 @@ struct cXyz : Vec {
z = vec.z;
}
#else
cXyz() = default;
cXyz() {
if (std::isnan(x)) {
x = 0.0f;
}
if (std::isnan(y)) {
y = 0.0f;
}
if (std::isnan(z)) {
z = 0.0f;
}
}
~cXyz() = default;
cXyz(const cXyz& vec) = default;
#endif