python / python/mypy

Segmentation fault when native coroutine compiled with mypyc is cancelled due to timeout

Open
#12,867 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

crash topic-async topic-mypyc
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Crash Report
Segmentation fault encountered with a mypyc compiled coroutine that was cancelled due to timeout when being invoked via asyncio.wait_for.

Traceback

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   Python                        	       0x1009af3eb PyException_SetTraceback + 107
1   crash.cpython-310-darwin.so   	       0x1011b1c8f CPy_CatchError + 127 (exc_ops.c:60)
2   crash.cpython-310-darwin.so   	       0x1011b472a CPyDef_crash_gen_____mypyc_generator_helper__ + 202 (__native.c:517)
3   crash.cpython-310-darwin.so   	       0x1011b55e8 CPyDef_crash_gen___throw + 23 (__native.c:938) [inlined]
4   crash.cpython-310-darwin.so   	       0x1011b55e8 CPyPy_crash_gen___throw + 152 (__native.c:984)
5   Python                        	       0x1009aceba method_vectorcall_FASTCALL_KEYWORDS + 170
6   Python                        	       0x1009a4cb5 PyObject_VectorcallMethod + 149
7   _asyncio.cpython-310-darwin.so	       0x100ef1563 task_step + 515
8   _asyncio.cpython-310-darwin.so	       0x100ef2b5b task_wakeup + 267
9   Python                        	       0x1009e9a18 cfunction_vectorcall_O + 280
10  Python                        	       0x100ab031a context_run + 250
11  Python                        	       0x1009e97c4 cfunction_vectorcall_FASTCALL_KEYWORDS + 132
12  Python                        	       0x100a90384 _PyEval_EvalFrameDefault + 28404
13  Python                        	       0x100a89362 _PyEval_Vector + 146
14  Python                        	       0x100a936ee call_function + 430
15  Python                        	       0x100a8ffbb _PyEval_EvalFrameDefault + 27435
16  Python                        	       0x100a89362 _PyEval_Vector + 146
17  Python                        	       0x100a936ee call_function + 430
18  Python                        	       0x100a8ffbb _PyEval_EvalFrameDefault + 27435
19  Python                        	       0x100a89362 _PyEval_Vector + 146
20  Python                        	       0x100a936ee call_function + 430
21  Python                        	       0x100a8ffbb _PyEval_EvalFrameDefault + 27435
22  Python                        	       0x100a89362 _PyEval_Vector + 146
23  Python                        	       0x100a936ee call_function + 430
24  Python                        	       0x100a8ffbb _PyEval_EvalFrameDefault + 27435
25  Python                        	       0x100a89362 _PyEval_Vector + 146
26  Python                        	       0x100a936ee call_function + 430
27  Python                        	       0x100a8ffe7 _PyEval_EvalFrameDefault + 27479
28  Python                        	       0x100a89362 _PyEval_Vector + 146
29  Python                        	       0x100a892b8 PyEval_EvalCode + 120
30  Python                        	       0x100addcb4 PyRun_StringFlags + 244
31  Python                        	       0x100addb75 PyRun_SimpleStringFlags + 69
32  Python                        	       0x100afd78f Py_RunMain + 463
33  Python                        	       0x100afe27f pymain_main + 335
34  Python                        	       0x100afe2db Py_BytesMain + 43
35  dyld                          	       0x1026de4fe start + 462


To Reproduce
A minimal example to reproduce the seg fault is:

crash.py

import asyncio

async def crash()->None:
    await asyncio.sleep(1)
mypyc crash.py
python -c "import asyncio; import crash; asyncio.run(asyncio.wait_for(crash.crash(), timeout=0.1))"

Your Environment

  • Mypy version used: mypy 0.950 (compiled: yes)
  • Mypy command-line flags: None
  • Mypy configuration options from mypy.ini (and other config files): None
  • Python version used: 3.10.4
  • Operating system and version: Originally encountered on macOS 12.1 (21C52)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with crash.py and reproduce the failure using mypyc, Python 3.10, and asyncio.wait_for with the provided timeout. Inspect the generated __native.c coroutine helper and throw path, along with CPy_CatchError in exc_ops.c, using the traceback as the entry point. Done means the minimal example handles cancellation without a segmentation fault.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.