From 6b99b6672e9f7d2c2edcc002d92834a7395aad01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Fri, 10 Feb 2023 19:55:59 +0100 Subject: [PATCH] Fix: [Script] ScriptBase::Rand() return value was between -MIN(int32) and MAX(int32) (#10443) Also ensure the parameters for ScriptBase::RandRange() and ScriptBase::Chance() are in [0-MAX(uint32)] range --- regression/regression/result.txt | 150 +++++++++++++++---------------- src/script/api/script_base.cpp | 15 ++-- src/script/api/script_base.hpp | 18 ++-- 3 files changed, 96 insertions(+), 87 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 7ce9550599..13a770a8aa 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -88,9 +88,9 @@ abs( 21): 21 --AIBase-- - Rand(): -2062310602 - Rand(): -1780331126 - Rand(): -397928569 + Rand(): 2232656694 + Rand(): 2514636170 + Rand(): 3897038727 RandRange(0): 0 RandRange(0): 0 RandRange(0): 0 @@ -421,36 +421,36 @@ 1099 => 46158 Randomize ListDump: 1 => 688298322 - 2 => -1709546982 + 2 => 2585420314 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 - 1006 => -1485224804 - 1007 => -311036236 - 1008 => -1503442439 - 1009 => -110945695 - 1010 => -82825175 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 + 1006 => 2809742492 + 1007 => 3983931060 + 1008 => 2791524857 + 1009 => 4184021601 + 1010 => 4212142121 1011 => 46859773 - 1012 => -1199223018 - 1013 => -1190555925 + 1012 => 3095744278 + 1013 => 3104411371 1014 => 326384434 1015 => 1486817960 - 1016 => -1411425597 - 1017 => -508426854 + 1016 => 2883541699 + 1017 => 3786540442 1018 => 820019294 1019 => 710762995 - 1020 => -760867032 - 1021 => -709611146 + 1020 => 3534100264 + 1021 => 3585356150 1022 => 732190215 1023 => 236336673 1024 => 740596257 1025 => 1135321785 1026 => 2067474156 - 1027 => -1395683607 - 1028 => -240528699 + 1027 => 2899283689 + 1028 => 4054438597 1029 => 928616892 1030 => 1712486685 1031 => 1994118287 @@ -462,46 +462,46 @@ 1037 => 1359697121 1038 => 1888433963 1039 => 941623020 - 1040 => -1925663292 - 1041 => -771540264 - 1042 => -1058341359 + 1040 => 2369304004 + 1041 => 3523427032 + 1042 => 3236625937 1043 => 182127597 1044 => 646955927 - 1045 => -1424621714 + 1045 => 2870345582 1046 => 623062612 - 1047 => -1986955586 - 1048 => -1268826980 - 1049 => -456776220 - 1051 => -1112555329 - 1052 => -1532134052 + 1047 => 2308011710 + 1048 => 3026140316 + 1049 => 3838191076 + 1051 => 3182411967 + 1052 => 2762833244 1053 => 1960404034 1054 => 1573325453 - 1055 => -316619303 + 1055 => 3978347993 1056 => 699712177 1057 => 863274966 1058 => 1728276475 - 1059 => -246695889 + 1059 => 4048271407 1060 => 1919485436 1061 => 111273464 1062 => 125435213 1063 => 155132602 - 1064 => -171674076 + 1064 => 4123293220 1065 => 655046914 1066 => 1577399562 1067 => 1028818150 1068 => 447058239 - 1069 => -1057920269 - 1070 => -1326215323 - 1071 => -198688588 + 1069 => 3237047027 + 1070 => 2968751973 + 1071 => 4096278708 1072 => 1523643051 1073 => 231373233 1074 => 1121759962 1075 => 1449439846 - 1076 => -1615270753 - 1077 => -1509293864 + 1076 => 2679696543 + 1077 => 2785673432 1078 => 2116903943 1079 => 672822173 - 1080 => -969573911 + 1080 => 3325393385 1081 => 1589904755 1082 => 1148782015 1083 => 663503316 @@ -510,54 +510,54 @@ 1086 => 402172048 1087 => 1812250453 1088 => 667300501 - 1089 => -1838825777 - 1090 => -856474776 + 1089 => 2456141519 + 1090 => 3438492520 1091 => 420696035 1092 => 2131427774 - 1093 => -435303548 - 1094 => -160883878 + 1093 => 3859663748 + 1094 => 4134083418 1095 => 1969629634 - 1096 => -555794155 - 1097 => -835119691 - 1098 => -1460907909 - 1099 => -1146924084 + 1096 => 3739173141 + 1097 => 3459847605 + 1098 => 2834059387 + 1099 => 3148043212 KeepTop(10): 1 => 688298322 - 2 => -1709546982 + 2 => 2585420314 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 - 1006 => -1485224804 - 1007 => -311036236 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 + 1006 => 2809742492 + 1007 => 3983931060 KeepBottom(8): 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 - 1006 => -1485224804 - 1007 => -311036236 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 + 1006 => 2809742492 + 1007 => 3983931060 RemoveBottom(2): 1000 => 1701392078 - 1001 => -1630848421 - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 + 1001 => 2664118875 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 RemoveTop(2): - 1002 => -886500935 - 1003 => -196324972 - 1004 => -436037402 - 1005 => -520341784 + 1002 => 3408466361 + 1003 => 4098642324 + 1004 => 3858929894 + 1005 => 3774625512 RemoveList({1003, 1004}): - 1002 => -886500935 - 1005 => -520341784 + 1002 => 3408466361 + 1005 => 3774625512 KeepList({1003, 1004, 1005}): - 1005 => -520341784 + 1005 => 3774625512 AddList({1005, 4000, 4001, 4002}): 1005 => 1005 4000 => 8000 diff --git a/src/script/api/script_base.cpp b/src/script/api/script_base.cpp index 52946520a2..ab5dd848bc 100644 --- a/src/script/api/script_base.cpp +++ b/src/script/api/script_base.cpp @@ -13,33 +13,36 @@ #include "../../safeguards.h" -/* static */ uint32 ScriptBase::Rand() +/* static */ SQInteger ScriptBase::Rand() { return ScriptObject::GetRandomizer().Next(); } -/* static */ uint32 ScriptBase::RandItem(int unused_param) +/* static */ SQInteger ScriptBase::RandItem(SQInteger unused_param) { return ScriptBase::Rand(); } -/* static */ uint ScriptBase::RandRange(uint max) +/* static */ SQInteger ScriptBase::RandRange(SQInteger max) { + max = Clamp(max, 0, UINT32_MAX); return ScriptObject::GetRandomizer().Next(max); } -/* static */ uint32 ScriptBase::RandRangeItem(int unused_param, uint max) +/* static */ SQInteger ScriptBase::RandRangeItem(SQInteger unused_param, SQInteger max) { return ScriptBase::RandRange(max); } -/* static */ bool ScriptBase::Chance(uint out, uint max) +/* static */ bool ScriptBase::Chance(SQInteger out, SQInteger max) { + out = Clamp(out, 0, UINT32_MAX); + max = Clamp(max, 0, UINT32_MAX); EnforcePrecondition(false, out <= max); return ScriptBase::RandRange(max) < out; } -/* static */ bool ScriptBase::ChanceItem(int unused_param, uint out, uint max) +/* static */ bool ScriptBase::ChanceItem(SQInteger unused_param, SQInteger out, SQInteger max) { return ScriptBase::Chance(out, max); } diff --git a/src/script/api/script_base.hpp b/src/script/api/script_base.hpp index 4184e79d69..3b0422a7e2 100644 --- a/src/script/api/script_base.hpp +++ b/src/script/api/script_base.hpp @@ -25,50 +25,56 @@ public: * Get a random value. * @return A random value between 0 and MAX(uint32). */ - static uint32 Rand(); + static SQInteger Rand(); /** * Get a random value. * @param unused_param This parameter is not used, but is needed to work with lists. * @return A random value between 0 and MAX(uint32). */ - static uint32 RandItem(int unused_param); + static SQInteger RandItem(SQInteger unused_param); /** * Get a random value in a range. * @param max The first number this function will never return (the maximum it returns is max - 1). + * The value will be clamped to 0 .. MAX(uint32). * @return A random value between 0 .. max - 1. */ - static uint RandRange(uint max); + static SQInteger RandRange(SQInteger max); /** * Get a random value in a range. * @param unused_param This parameter is not used, but is needed to work with lists. * @param max The first number this function will never return (the maximum it returns is max - 1). + * The value will be clamped to 0 .. MAX(uint32). * @return A random value between 0 .. max - 1. */ - static uint RandRangeItem(int unused_param, uint max); + static SQInteger RandRangeItem(SQInteger unused_param, SQInteger max); /** * Returns approximately 'out' times true when called 'max' times. * After all, it is a random function. * @param out How many times it should return true. + * The value will be clamped to 0 .. MAX(uint32). * @param max Out of this many times. + * The value will be clamped to 0 .. MAX(uint32). * @pre \a out is at most equal to \a max. * @return True if the chance worked out. */ - static bool Chance(uint out, uint max); + static bool Chance(SQInteger out, SQInteger max); /** * Returns approximately 'out' times true when called 'max' times. * After all, it is a random function. * @param unused_param This parameter is not used, but is needed to work with lists. * @param out How many times it should return true. + * The value will be clamped to 0 .. MAX(uint32). * @param max Out of this many times. + * The value will be clamped to 0 .. MAX(uint32). * @pre \a out is at most equal to \a max. * @return True if the chance worked out. */ - static bool ChanceItem(int unused_param, uint out, uint max); + static bool ChanceItem(SQInteger unused_param, SQInteger out, SQInteger max); }; #endif /* SCRIPT_BASE_HPP */