Skip to content

typing.ClassVar string annotation can crash msgspec #1096

Closed

Description

@sobolevn

Repro:

from __future__ import annotations
from msgspec import Struct

class typing:
    pass

# These two annotations are incorrect, but they should not crash:
class Ex(Struct):
    a: typing.ClassVar
    b: typing.ClassVar[int]

I have a fix ready. Found during initial work on #1095

Log:

Current thread 0x000000020e02a0c0 (most recent call first):
  File "<string>", line 8 in <module>
  File "/Users/sobolev/Desktop/msgspec/tests/unit/utils.py", line 20 in temp_module
  File "/Users/sobolev/.pyenv/versions/3.15-dev/lib/python3.15/contextlib.py", line 203 in __enter__
  File "/Users/sobolev/Desktop/msgspec/tests/unit/test_struct.py", line 2621 in test_classvar
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/python.py", line 167 in pytest_pyfunc_call
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_callers.py", line 121 in _multicall
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_hooks.py", line 512 in __call__
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/python.py", line 1707 in runtest
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/runner.py", line 184 in pytest_runtest_call
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_callers.py", line 121 in _multicall
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_hooks.py", line 512 in __call__
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/runner.py", line 250 in <lambda>
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/runner.py", line 361 in from_call
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/runner.py", line 249 in call_and_report
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/runner.py", line 139 in runtestprotocol
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/runner.py", line 118 in pytest_runtest_protocol
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_callers.py", line 121 in _multicall
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_hooks.py", line 512 in __call__
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/main.py", line 408 in pytest_runtestloop
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_callers.py", line 121 in _multicall
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_hooks.py", line 512 in __call__
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/main.py", line 384 in _main
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/main.py", line 330 in wrap_session
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/main.py", line 377 in pytest_cmdline_main
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_callers.py", line 121 in _multicall
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_manager.py", line 120 in _hookexec
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/pluggy/_hooks.py", line 512 in __call__
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/config/__init__.py", line 229 in _main
  File "/Users/sobolev/Desktop/msgspec/.venv/lib/python3.15/site-packages/_pytest/config/__init__.py", line 253 in _console_main
  File "/Users/sobolev/Desktop/msgspec/.venv/bin/pytest", line 10 in <module>

Current thread's C stack trace (most recent call first):
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _Py_DumpStack+0x44 [0x105b8a0c4]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at faulthandler_fatal_error+0x210 [0x105ba4370]
  Binary file "/usr/lib/system/libsystem_platform.dylib", at _sigtramp+0x38 [0x1a00d16a4]
  Binary file "/Users/sobolev/Desktop/msgspec/src/msgspec/_core.cpython-315-darwin.so", at structmeta_is_classvar+0x1c4 [0x10707ad3c]
  Binary file "/Users/sobolev/Desktop/msgspec/src/msgspec/_core.cpython-315-darwin.so", at structmeta_collect_fields+0x470 [0x107078de0]
  Binary file "/Users/sobolev/Desktop/msgspec/src/msgspec/_core.cpython-315-darwin.so", at StructMeta_new_inner+0x42c [0x107077bf8]
  Binary file "/Users/sobolev/Desktop/msgspec/src/msgspec/_core.cpython-315-darwin.so", at StructMeta_new+0x20c [0x1070c00e4]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at type_call+0x54 [0x105a36b70]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyObject_MakeTpCall+0x130 [0x1059a22fc]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at builtin___build_class__+0x640 [0x105ae920c]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at PyObject_Vectorcall+0x58 [0x1059a2a54]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _Py_VectorCallInstrumentation_StackRefSteal+0x12c [0x105aeeed4]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyEval_EvalFrameDefault+0x19f4 [0x105af1670]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at PyEval_EvalCode+0x1ac [0x105aee734]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at run_mod+0x278 [0x105b70fc8]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyRun_StringFlagsWithName+0xfc [0x105b6f02c]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at builtin_exec+0x59c [0x105aeae3c]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyEval_EvalFrameDefault+0x2888 [0x105af2504]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at gen_send_ex+0x214 [0x1059bfe40]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at gen_iternext+0x1c [0x1059be698]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at builtin_next+0x64 [0x105aebcc8]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyEval_EvalFrameDefault+0x25f4 [0x105af2270]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyEval_Vector+0x20c [0x105aee97c]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyObject_VectorcallPrepend+0xa8 [0x1059a3c34]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyVectorcall_Call+0x74 [0x1059a2920]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyEval_EvalFrameDefault+0x2b70 [0x105af27ec]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyEval_Vector+0x20c [0x105aee97c]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyObject_VectorcallDictTstate+0x90 [0x1059a20ac]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyObject_Call_Prepend+0x98 [0x1059a30a8]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at slot_tp_call+0x7c [0x105a3e8fc]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _PyObject_MakeTpCall+0x130 [0x1059a22fc]
  Binary file "/Users/sobolev/.pyenv/versions/3.15-dev/lib/libpython3.15.dylib", at _Py_VectorCall_StackRefSteal+0x114 [0x105aeebb0]
  <truncated rest of calls>

Extension modules: msgspec._core (total: 1)
[1]    73321 segmentation fault  pytest -o testpaths=tests/unit -vv
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions