Преглед на файлове

[GDScript] Prevent running `String` number functions on invalid literal

Prevents printing excessive errors.
A Thousand Ships преди 1 година
родител
ревизия
66d55e62f0
променени са 1 файла, в които са добавени 14 реда и са изтрити 0 реда
  1. 14 0
      modules/gdscript/gdscript_tokenizer.cpp

+ 14 - 0
modules/gdscript/gdscript_tokenizer.cpp

@@ -672,6 +672,7 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
 	bool has_decimal = false;
 	bool has_exponent = false;
 	bool has_error = false;
+	bool need_digits = false;
 	bool (*digit_check_func)(char32_t) = is_digit;
 
 	// Sign before hexadecimal or binary.
@@ -686,11 +687,13 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
 			// Hexadecimal.
 			base = 16;
 			digit_check_func = is_hex_digit;
+			need_digits = true;
 			_advance();
 		} else if (_peek() == 'b') {
 			// Binary.
 			base = 2;
 			digit_check_func = is_binary_digit;
+			need_digits = true;
 			_advance();
 		}
 	}
@@ -717,6 +720,7 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
 			}
 			previous_was_underscore = true;
 		} else {
+			need_digits = false;
 			previous_was_underscore = false;
 		}
 		_advance();
@@ -820,6 +824,16 @@ GDScriptTokenizer::Token GDScriptTokenizer::number() {
 		}
 	}
 
+	if (need_digits) {
+		// No digits in hex or bin literal.
+		Token error = make_error(vformat(R"(Expected %s digit after "0%c".)", (base == 16 ? "hexadecimal" : "binary"), (base == 16 ? 'x' : 'b')));
+		error.start_column = column;
+		error.leftmost_column = column;
+		error.end_column = column + 1;
+		error.rightmost_column = column + 1;
+		return error;
+	}
+
 	// Detect extra decimal point.
 	if (!has_error && has_decimal && _peek() == '.' && _peek(1) != '.') {
 		Token error = make_error("Cannot use a decimal point twice in a number.");