[Cython] segfault with fused types and __kwdefaults__

Zach Pincus zpincus at gmail.com
Sun Mar 6 17:58:54 EST 2016


Hi all,

Just found an odd bug, which occurs with both Python 3.4.3 / Cython
0.23.4 and Python 2.7.10 / Cython 0.22.1 (the versions that happen to
be on my machine).

Specifically, a cython function with a fused type *and* a keyword
argument in its signature will cause a segfault when its
__kwdefaults__ attribute is looked up. (Which happens if, say, you try
to get the function documentation in python via "function?", or
otherwise do any inspection...)

Example:

foo.pyx
-----
ctypedef fused FUSED:
    float
    int

def foo(FUSED bar, baz=None):
    pass
-----

in python:

>>> import pyximport; pyximport.install()
(None, <pyximport.pyximport.PyxImporter object at 0x10f7c0410>)
>>> import foo
>>> foo.foo.__kwdefaults__
zsh: segmentation fault

This works of course when compiled with a setup.py script as well; the
above is just the most minimal test case. There's no segfault without
the keyword argument, and no segfault if the fused type is replaced
with a regular type.

Here's the chunk of the backtrace that's in cython code (from running
python3 under lldb):

  * frame #0: 0x0000000103b801b9
foo.so`__pyx_pf_3foo_12__defaults__(__pyx_self=0x0000000102741458) +
41 at foo.c:1294

   1291   __Pyx_XDECREF(__pyx_r);
   1292   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1))
{__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno =
__LINE__; goto __pyx_L1_error;}
   1293   __Pyx_GOTREF(__pyx_t_1);
-> 1294   __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults2,
__pyx_self)->__pyx_arg_baz);
   1295   __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults2,
__pyx_self)->__pyx_arg_baz);
   1296   PyTuple_SET_ITEM(__pyx_t_1, 0,
__Pyx_CyFunction_Defaults(__pyx_defaults2,
__pyx_self)->__pyx_arg_baz);
   1297   __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2))
{__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno =
__LINE__; goto __pyx_L1_error;}

    frame #1: 0x0000000103b838c0
foo.so`__Pyx_CyFunction_get_kwdefaults [inlined]
__Pyx_CyFunction_init_defaults(op=0x0000000102741458) + 5 at
foo.c:2789

    frame #2: 0x0000000103b838bb
foo.so`__Pyx_CyFunction_get_kwdefaults(op=0x0000000102741458) + 43 at
foo.c:2859

Best,
Zach

Zachary Pincus, PhD
Assistant Professor of Developmental Biology and Genetics
Washington University School of Medicine
http://zplab.wustl.edu


More information about the cython-devel mailing list