From 90c58dae2bf21f6e7544300b59c657ddbac1e897 Mon Sep 17 00:00:00 2001 From: Jon Meow <46229924+jonmeow@users.noreply.github.com> Date: Mon, 13 Dec 2021 11:08:00 -0800 Subject: [PATCH] Limit the number of parsed digits in numeric literals (#979) --- .../a6c9027065d9ae3dc8f1b1b880d5f1775240ca0c | 1 + .../eec540334e2254864e033353ec23daa556fadcd0 | Bin 0 -> 32768 bytes toolchain/lexer/numeric_literal.cpp | 30 ++++++++++++++++++ toolchain/lexer/numeric_literal_test.cpp | 6 ++++ 4 files changed, 37 insertions(+) create mode 100644 toolchain/lexer/fuzzer_corpus/numeric_literal/a6c9027065d9ae3dc8f1b1b880d5f1775240ca0c create mode 100644 toolchain/lexer/fuzzer_corpus/tokenized_buffer/eec540334e2254864e033353ec23daa556fadcd0 diff --git a/toolchain/lexer/fuzzer_corpus/numeric_literal/a6c9027065d9ae3dc8f1b1b880d5f1775240ca0c b/toolchain/lexer/fuzzer_corpus/numeric_literal/a6c9027065d9ae3dc8f1b1b880d5f1775240ca0c new file mode 100644 index 000000000000..838afc54bb4b --- /dev/null +++ b/toolchain/lexer/fuzzer_corpus/numeric_literal/a6c9027065d9ae3dc8f1b1b880d5f1775240ca0c @@ -0,0 +1 @@ +28000018446744073709551616000000000000000052__00000000000000000000000000000000000000000012880500000000000000000000000000000000000000000000000184467440737295518446744073_000000000000000000000000000000000000000000128805000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184000000000000000500000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000006000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000060000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000600000000000000000002880500000000000000000000000000000000000000000000000184467440737295516160000000000001844674407370900000000000000128805000000000000000000000000000000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000000000000000000000000000000000000000000001844674407372616000146744073709551440700000000000000000000000000001288050000000000000000000000000000000000000000000000018446744073729551844674407370955160000000000000000000000000000000000000000000184467440727295516160000000000001840000000000000005000000000000000000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000002000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000200000000000000000000000000000001844674407372955161600000000000018446744073709000000000000001288050000000000000000000000000000000000000000000000018446744073729551844674407370955161600000000000000000002880500000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000000000000000000001844674407372955161600000000000018446744073709551000000000000000000128805000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000050000000000000000000000000000000000000000000000000000000001844674407372955161600000000000000005000001616000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000002000000000000000000000000000000018446744073729551616000000000000184467440737090000000000000012880500000000000000000000000000000000000000000000000184467440737295518446744073709551616000000000000000000028805000000000000000000000000000000001844674407372955184467440737095516160000000000000000000288050000000000000000000000000000000000000000000000018446744073729551616000000000000184467440737095510000000000000000001288050000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005000000000000000000000000000000000000000000000000000000000184467440737295516160000000000000000500000161600000000000000005 0000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000016160000000000000000500000000000000000000000000000000000000000000000000000000018446744073729551616000000000000000050000000000000000000000000000000000000000000000184467440737261600014674407370(9547440737000184467440737261600014674407370(954744073700018446744073726160001467440950737ÐÆÊÊÎÉÊÐ616……1256……257777 \ No newline at end of file diff --git a/toolchain/lexer/fuzzer_corpus/tokenized_buffer/eec540334e2254864e033353ec23daa556fadcd0 b/toolchain/lexer/fuzzer_corpus/tokenized_buffer/eec540334e2254864e033353ec23daa556fadcd0 new file mode 100644 index 0000000000000000000000000000000000000000..d35da287909ccd98788e8d83d22cb4b6de35fd8b GIT binary patch literal 32768 zcmeI5&ub(_6vr!@QyLTz1P{XMEbAtQ8McQVi1`nux5lLVoboB zH^GA^1wjyx0WTgzFoLjqklFR77s3BvK-gW(VaHcLy1J^nW-^mZHi>+Tq`Q8+dR6s# zuj|JQ^h~i2KHOq#ewzI=%S7n+`xUxHjNN#%)oL-ew#It<`*d4Nk~m3{vJQLVPUT8Y zL~hdm0_%vd*lK5r_2SHOr&MZ{TCI+fouUpd&IG~366c}3tcDQ+2uz3opO7A?0fBQ( z0JG}3HXk|<0w6F7fqSC}K?Vds00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`; zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00d5&K$r`^e4l0nxv-Sk}7xZ4UuBiIOGjpt<{=5Y*rg_txA8@dRzF!cilRYxOt|>(zSLOp>Tktz9CSxlgFVYs-tz zE(VJvC?unBH4GEd5h^9JKD~*Ua(huP>`Bc*xLXPya!#4yT-xYcx&k+4el^rV;wFRc zXs|o5KdNQFqGR;uuOkNqRCUWY67}9@1IB?nY%nFxo|csLSPh!t3dKvJMPtV3mc2aY z)jgQ^+SgLzv+vQJYS_4sVMLfBeZIMTDl4I!h&(e;S!#tzPhFo8v zIgEMAzjgu%wDPl2ElPeUR+N+0N7kf8Vvj}(9&JVaed_O2xXrIqsEA9JGQwtNH92EN z?1e$ZrD+mc1V&vGsEew>%qF2)E%MpL#Xw37_K9>+N{;Ljhocze5>)eyIKlb!fdR&* z)!ukn5SWe1C|i(vlLCvPq+a7uQX8<#cp)>nax6-x?pSbCx08QQE@Yj^jW>P5tg%ZV z$J(HMc7e7kQjNUiXID=HjP1zjgbAk2tm;LU&(UQg=v0zpnbbFT{eItqH*VDRqe)Dj z85a_U7i>@4f%=DB;~r#x_T`=Ih!|io>Ac9n}f5Rq4oU)G1*;&Pm4d%?bLf zbNqUuV0%CPY+E7kA?~B)bkmSXCt8t_Z3o<0)(Gd;{Ux@vMAO(i^gn%dbz22Wv~O*- zH#!udaJRj^#irZzD>OPM==TFzvbMgyzOu4%HQh2C+}_xDEPt(rt5DH*al6;;e)HuY z-Ct#vU9fs(=aBu0uwzY)$;YklSvz zOC1~1s;NIr$k(+BcgZM4X3SB_OXZ(nH|!BuV;Ai&Qk~wKS!OE6xeN4yezs(} z6d%}#Rgl*!)5%`4cd&O`Xi|z!dAg(DaJ$**^u^QYa8+Aoxs%Ra%vxtfqH49-taILs z8uSrrtzL~1e)mpWg)hFcG(1n?IV!u8~pFE0~4-?Md7g?6+aQss+aQt%@tRV+6YXvh) zo7(0(SF<+z};!11r$PR|!~Kh5Lcn6wOK5y?BXEX*=9+5hqJ&oW~n zTC{7WAY)}%`%DuZ=g_*H&{o>oNK@*l-}A`!&%l?Bj~;ybz&#&~{N;o}s3H^Fx&H?i CoxJ@3 literal 0 HcmV?d00001 diff --git a/toolchain/lexer/numeric_literal.cpp b/toolchain/lexer/numeric_literal.cpp index e9fb3e7ebe83..8e2751fb1ccf 100644 --- a/toolchain/lexer/numeric_literal.cpp +++ b/toolchain/lexer/numeric_literal.cpp @@ -80,6 +80,21 @@ struct WrongRealLiteralExponent { char expected; }; + +struct TooManyDigits { + static constexpr llvm::StringLiteral ShortName = "syntax-invalid-number"; + + auto Format() -> std::string { + return llvm::formatv( + "Found a sequence of {0} digits, which is greater than the " + "limit of {1}.", + count, limit) + .str(); + } + + size_t count; + size_t limit; +}; } // namespace auto LexedNumericLiteral::Lex(llvm::StringRef source_text) @@ -366,6 +381,21 @@ auto LexedNumericLiteral::Parser::CheckDigitSequence( CheckDigitSeparatorPlacement(text, radix, num_digit_separators); } + // llvm::getAsInteger is used for parsing, but it's quadratic and visibly slow + // on large integer values. This limit exists to avoid hitting those limits. + // Per https://github.com/carbon-language/carbon-lang/issues/980, it may be + // feasible to optimize integer parsing in order to address performance if + // this limit becomes an issue. + // + // 2^128 would be 39 decimal digits or 128 binary. In either case, this limit + // is far above the threshold for normal integers. + constexpr size_t DigitLimit = 1000; + if (text.size() > DigitLimit) { + emitter_.EmitError( + text.begin(), {.count = text.size(), .limit = DigitLimit}); + return {.ok = false}; + } + return {.ok = true, .has_digit_separators = (num_digit_separators != 0)}; } diff --git a/toolchain/lexer/numeric_literal_test.cpp b/toolchain/lexer/numeric_literal_test.cpp index b067b7c65442..4ac2e1847f64 100644 --- a/toolchain/lexer/numeric_literal_test.cpp +++ b/toolchain/lexer/numeric_literal_test.cpp @@ -331,5 +331,11 @@ TEST_F(NumericLiteralTest, ValidatesRealLiterals) { } } +TEST_F(NumericLiteralTest, TooManyDigits) { + std::string long_number(2000, '1'); + EXPECT_THAT(Parse(long_number), HasUnrecoverableError()); + EXPECT_TRUE(error_tracker.SeenError()); +} + } // namespace } // namespace Carbon