From 6cbb9193eab72c1c8c6cf90ad2bd21a4257d287b Mon Sep 17 00:00:00 2001 From: fuzun Date: Thu, 15 Feb 2024 11:05:42 +0100 Subject: [PATCH] Fix undefined behaviors (#14365) * Initialize member `floats` in ContentFeatures * Do not assign big double to u32 * Do not assign negative floating point number to unsigned integer --- src/mapgen/mg_biome.cpp | 6 +++++- src/nodedef.cpp | 2 ++ src/tool.cpp | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/mapgen/mg_biome.cpp b/src/mapgen/mg_biome.cpp index 5a4501693..beb457c0f 100644 --- a/src/mapgen/mg_biome.cpp +++ b/src/mapgen/mg_biome.cpp @@ -297,7 +297,11 @@ Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, v3s16 po // Carefully tune pseudorandom seed variation to avoid single node dither // and create larger scale blending patterns similar to horizontal biome // blend. - const u64 seed = pos.Y + (heat + humidity) * 0.9f; + // The calculation can be a negative floating point number, which is an + // undefined behavior if assigned to unsigned integer. Cast the result + // into signed integer before it is casted into unsigned integer to + // eliminate the undefined behavior. + const u64 seed = static_cast(pos.Y + (heat + humidity) * 0.9f); PcgRandom rng(seed); if (biome_closest_blend && dist_min_blend <= dist_min && diff --git a/src/nodedef.cpp b/src/nodedef.cpp index c707511ed..7efac7fc0 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -356,6 +356,8 @@ void ContentFeatures::reset() has_on_construct = false; has_on_destruct = false; has_after_destruct = false; + floats = false; + /* Actual data diff --git a/src/tool.cpp b/src/tool.cpp index 36ad1c608..3f3c2f7bd 100644 --- a/src/tool.cpp +++ b/src/tool.cpp @@ -416,8 +416,7 @@ DigParams getDigParams(const ItemGroupList &groups, // The actual number of uses increases // exponentially with leveldiff. // If the levels are equal, real_uses equals cap.uses. - u32 real_uses = cap.uses * pow(3.0, leveldiff); - real_uses = MYMIN(real_uses, U16_MAX); + const u32 real_uses = std::min(cap.uses * pow(3.0, leveldiff), U16_MAX); result_wear = calculateResultWear(real_uses, initial_wear); result_main_group = groupname; }