commit 229963a7d6b2270e522fd60ea3e260e1058dc206 from: Sergey Bronnikov date: Wed Jan 31 08:41:59 2024 UTC test/fuzz: fix errors "'' expected near 'and'" Running of automatically generated Lua programs sometimes failed with an error "'' expected near 'and'" (0.07%). Example of the error is the following: ```lua local t = {} t.or = 0 -- "'' expected near 'or'" t.nil = 0 -- "'' expected near 'nil'" t.not = 0 -- "'' expected near 'not'" ``` This error was caused by reserved Lua keywords used as table indices. The patch fixes serializer, if the automatically generated index name is equal to the reserved keyword then postfix "_1" is added to index name. NO_CHANGELOG=testing NO_DOC=testing NO_TEST=testing commit - c3c00e1340a896b10848991b4c36b0c11dd5e84e commit + 229963a7d6b2270e522fd60ea3e260e1058dc206 blob - 100f35ed35d865752c08144198544e300f9adab2 blob + 22fc272c4623152e905f00659345cb747f262e6f --- test/fuzz/luaL_loadbuffer/serializer.cc +++ test/fuzz/luaL_loadbuffer/serializer.cc @@ -25,6 +25,34 @@ extern char preamble_lua[]; namespace luajit_fuzzer { namespace { +/* + * The following keywords are reserved and cannot be used as names, + * see Lua 5.1 Reference Manual, 2.1 – Lexical Conventions. + */ +const std::set KReservedLuaKeywords { + "and", + "break", + "do", + "else", + "elseif", + "end", + "false", + "for", + "function", + "if", + "in", + "local", + "nil", + "not", + "or", + "repeat", + "return", + "then", + "true", + "until", + "while", +}; + const std::string kCounterNamePrefix = "counter_"; const std::string kNumberWrapperName = "always_number"; const std::string kBinOpWrapperName = "only_numbers_cmp"; @@ -911,7 +939,12 @@ NESTED_PROTO_TOSTRING(IndexWithName, indexname, Variab { std::string indexname_str = PrefixExpressionToString( indexname.prefixexp()); - indexname_str += "." + ConvertToStringDefault(indexname.name()); + std::string idx_str = ConvertToStringDefault(indexname.name()); + /* Prevent using reserved keywords as indices. */ + if (KReservedLuaKeywords.find(idx_str) != KReservedLuaKeywords.end()) { + idx_str += "_1"; + } + indexname_str += "." + idx_str; return indexname_str; }