diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/exceptions.h | 5 | ||||
-rw-r--r-- | src/noise.cpp | 4 | ||||
-rw-r--r-- | src/noise.h | 8 |
3 files changed, 13 insertions, 4 deletions
diff --git a/src/exceptions.h b/src/exceptions.h index 0ea4c9350..6bf832828 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -120,6 +120,11 @@ public: ClientStateError(std::string s): BaseException(s) {} }; +class PrngException : public BaseException { +public: + PrngException(std::string s): BaseException(s) {} +}; + /* Some "old-style" interrupts: */ diff --git a/src/noise.cpp b/src/noise.cpp index 4bfc46f15..2e4588124 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -115,7 +115,9 @@ u32 PcgRandom::range(u32 bound) s32 PcgRandom::range(s32 min, s32 max) { - assert(max >= min); + if (max < min) + throw PrngException("Invalid range (max < min)"); + u32 bound = max - min + 1; return range(bound) + min; } diff --git a/src/noise.h b/src/noise.h index d2287835e..5757cbc99 100644 --- a/src/noise.h +++ b/src/noise.h @@ -26,8 +26,8 @@ #ifndef NOISE_HEADER #define NOISE_HEADER -#include "debug.h" #include "irr_v3d.h" +#include "exceptions.h" #include "util/string.h" extern FlagDesc flagdesc_noiseparams[]; @@ -56,14 +56,16 @@ public: inline int range(int min, int max) { - assert(max >= min); + if (max < min) + throw PrngException("Invalid range (max < min)"); /* Here, we ensure the range is not too large relative to RANDOM_MAX, as otherwise the effects of bias would become noticable. Unlike PcgRandom, we cannot modify this RNG's range as it would change the output of this RNG for reverse compatibility. */ - assert((u32)(max - min) <= (RANDOM_RANGE + 1) / 10); + if ((u32)(max - min) > (RANDOM_RANGE + 1) / 10) + throw PrngException("Range too large"); return (next() % (max - min + 1)) + min; } |