|
@@ -1650,8 +1650,9 @@ int64_t String::hex_to_int(bool p_with_prefix) const {
|
|
} else {
|
|
} else {
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
- ERR_FAIL_COND_V_MSG(hex > INT64_MAX / 16, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
|
|
|
|
+ // Check for overflow/underflow, with special case to ensure INT64_MIN does not result in error
|
|
|
|
+ bool overflow = ((hex > INT64_MAX / 16) && (sign == 1 || (sign == -1 && hex != (INT64_MAX >> 4) + 1))) || (sign == -1 && hex == (INT64_MAX >> 4) + 1 && c > '0');
|
|
|
|
+ ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
hex *= 16;
|
|
hex *= 16;
|
|
hex += n;
|
|
hex += n;
|
|
s++;
|
|
s++;
|
|
@@ -1690,8 +1691,9 @@ int64_t String::bin_to_int(bool p_with_prefix) const {
|
|
} else {
|
|
} else {
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
- ERR_FAIL_COND_V_MSG(binary > INT64_MAX / 2, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
|
|
|
|
+ // Check for overflow/underflow, with special case to ensure INT64_MIN does not result in error
|
|
|
|
+ bool overflow = ((binary > INT64_MAX / 2) && (sign == 1 || (sign == -1 && binary != (INT64_MAX >> 1) + 1))) || (sign == -1 && binary == (INT64_MAX >> 1) + 1 && c > '0');
|
|
|
|
+ ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
binary *= 2;
|
|
binary *= 2;
|
|
binary += n;
|
|
binary += n;
|
|
s++;
|
|
s++;
|
|
@@ -1713,7 +1715,8 @@ int64_t String::to_int() const {
|
|
for (int i = 0; i < to; i++) {
|
|
for (int i = 0; i < to; i++) {
|
|
CharType c = operator[](i);
|
|
CharType c = operator[](i);
|
|
if (c >= '0' && c <= '9') {
|
|
if (c >= '0' && c <= '9') {
|
|
- ERR_FAIL_COND_V_MSG(integer > INT64_MAX / 10, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as an integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
|
|
|
|
+ bool overflow = (integer > INT64_MAX / 10) || (integer == INT64_MAX / 10 && ((sign == 1 && c > '7') || (sign == -1 && c > '8')));
|
|
|
|
+ ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
integer *= 10;
|
|
integer *= 10;
|
|
integer += c - '0';
|
|
integer += c - '0';
|
|
|
|
|
|
@@ -1741,7 +1744,8 @@ int64_t String::to_int(const char *p_str, int p_len) {
|
|
for (int i = 0; i < to; i++) {
|
|
for (int i = 0; i < to; i++) {
|
|
char c = p_str[i];
|
|
char c = p_str[i];
|
|
if (c >= '0' && c <= '9') {
|
|
if (c >= '0' && c <= '9') {
|
|
- ERR_FAIL_COND_V_MSG(integer > INT64_MAX / 10, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + String(p_str).substr(0, to) + " as an integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
|
|
|
|
+ bool overflow = (integer > INT64_MAX / 10) || (integer == INT64_MAX / 10 && ((sign == 1 && c > '7') || (sign == -1 && c > '8')));
|
|
|
|
+ ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + String(p_str).substr(0, to) + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
|
|
integer *= 10;
|
|
integer *= 10;
|
|
integer += c - '0';
|
|
integer += c - '0';
|
|
|
|
|