During fuzzing, I found a case making the Cairo compiler crash. The crash occurs when compiling an invalid Cairo code that raises a lark lark.exceptions.UnexpectedCharacters
exception (that is not catch internally).
python3 replay_crash.py
Traceback (most recent call last):
File "replay_crash.py", line 5, in <module>
program = compile_cairo(code, 2 ** 251 + 17 * 2 ** 192 + 1, debug_info=True)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/cairo_compile.py", line 259, in compile_cairo
program, _ = compile_cairo_ex(
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/cairo_compile.py", line 228, in compile_cairo_ex
preprocessed_program = preprocess_codes(
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/preprocessor/preprocess_codes.py", line 26, in preprocess_codes
pass_manager.run(context)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/preprocessor/pass_manager.py", line 55, in run
stage.run(context)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/preprocessor/default_pass_manager.py", line 154, in run
self.collect_module(
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/preprocessor/default_pass_manager.py", line 124, in collect_module
files = collect_imports(filename, read_file=read_file_fixed)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/import_loader.py", line 30, in collect_imports
collector.collect(curr_pkg_name)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/import_loader.py", line 81, in collect
parsed_file: CairoFile = parse_file(code, filename=filename)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/parser.py", line 241, in parse_file
return parse(filename, code, "cairo_file", CairoFile, parser_context=parser_context)
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/parser.py", line 209, in parse
raise wrap_lark_error(err, input_file) from None
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/parser.py", line 161, in wrap_lark_error
raise err
File "/usr/cairo_venv/lib/python3.8/site-packages/starkware/cairo/lang/compiler/parser.py", line 195, in parse
for token in parser.lexer_state.lex(parser_state):
File "/usr/cairo_venv/lib/python3.8/site-packages/lark/lexer.py", line 388, in lex
yield self.next_token(state, parser_state)
File "/usr/cairo_venv/lib/python3.8/site-packages/lark/lexer.py", line 398, in next_token
raise UnexpectedCharacters(lex_state.text, line_ctr.char_pos, line_ctr.line, line_ctr.column,
lark.exceptions.UnexpectedCharacters: No terminal matches '
' in the current parser context, at line 1 col 1
,
,VV
^
Expected one of:
* COMMENT
* SEMICOLON
* COLON
* RSQB
* LANG
* LPAR
* SHORT_STRING
* DOT
* HEXINT
* STRING
* RPAR
* SLASH
* LBRACE
* MINUS
* _ARROW
* _DBL_PLUS
* IDENTIFIER
* STAR
* _NEWLINE
* _AT
* EQUAL
* HINT
* COMMA
* PLUS
* "+="
* AMPERSAND
* RBRACE
* _DBL_EQ
* _DBL_STAR
* BUILTINS
* INT
* LSQB
* _NEQ
cairo-compile command-line tool is also crashing when providing directly those bytes inside a file.