[Numpy-discussion] Segfault with python 3.2 structured array non-existent field

Matthew Brett matthew.brett@gmail....
Tue Mar 15 12:06:09 CDT 2011


Hi,

On Sun, Mar 13, 2011 at 12:07 PM, Matthew Brett <matthew.brett@gmail.com> wrote:
> Hi,
>
> On Sun, Mar 13, 2011 at 11:51 AM, Christoph Gohlke <cgohlke@uci.edu> wrote:
>>
>>
>> On 3/13/2011 11:29 AM, Matthew Brett wrote:
>>>
>>> Hi
>>>
>>> On Sun, Mar 13, 2011 at 9:54 AM, Christoph Gohlke<cgohlke@uci.edu>  wrote:
>>>>
>>>> On 3/13/2011 1:57 AM, Matthew Brett wrote:
>>>>>
>>>>> Hi,
>>>>> I have this on my OSX 10.6 system and numpy 1.5.1 and current numpy
>>>>> head (30ee1d352):
>>>>>
>>>>> $ python3.2
>>>>> Python 3.2 (r32:88452, Feb 20 2011, 11:12:31)
>>>>> [GCC 4.2.1 (Apple Inc. build 5664)] on darwin
>>>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>>>>
>>>>>>>> import numpy as np
>>>>>>>> a = np.zeros((1,), dtype=[('f1', 'f')])
>>>>>>>> a['f1'] = 1
>>>>>>>> a['f2'] = 1
>>>>>
>>>>> Segmentation fault
>>>>>
>>>>> All tests pass with np.test()
>>>>>
>>>>> Expected behavior with same code on python2.6:
>>>>>
>>>>>>>> a['f2'] = 1
>>>>>
>>>>> Traceback (most recent call last):
>>>>>    File "<stdin>", line 1, in<module>
>>>>> ValueError: field named f2 not found.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> Matthew
>>>>
>>>> Confirmed on Windows. The crash is in line 816 of mapping.c:
>>>>
>>>>         PyErr_Format(PyExc_ValueError,
>>>>                      "field named %s not found.",
>>>>                      PyString_AsString(index));
>>>>
>>>> This works with Python 3.x:
>>>>
>>>>         PyErr_Format(PyExc_ValueError,
>>>>                      "field named %S not found.",
>>>>                      index);
>>>
>>> Sure enough, in python3.2:
>>>
>>>>>> a[b'f2'] = 1
>>>
>>> Traceback (most recent call last):
>>>   File "<stdin>", line 1, in<module>
>>> ValueError: field named f2 not found.
>>>
>>> That is - it is specifically passing a python 3 string that causes the
>>> segmentation fault.
>>>
>>> Is this a release blocker?  I'm afraid I don't know the code well
>>> enough to be confident of the right fix.  Is there something I can do
>>> to help?
>>
>> Please open a ticket at <http://projects.scipy.org/numpy> and refer to this
>> discussion and proposed fix.
>>
>> diff --git a/numpy/core/src/multiarray/mapping.c
>> b/numpy/core/src/multiarray/mapping.c
>> index 8db85bf..3a72811 100644
>> --- a/numpy/core/src/multiarray/mapping.c
>> +++ b/numpy/core/src/multiarray/mapping.c
>> @@ -812,10 +812,16 @@ array_ass_sub(PyArrayObject *self, PyObject *index,
>> PyObject *op)
>>                 }
>>             }
>>         }
>> -
>> +#if defined(NPY_PY3K)
>> +        PyErr_Format(PyExc_ValueError,
>> +                     "field named %S not found.",
>> +                     index);
>> +#else
>>         PyErr_Format(PyExc_ValueError,
>>                      "field named %s not found.",
>>                      PyString_AsString(index));
>> +#endif
>> +
>>         return -1;
>>     }
>
> http://projects.scipy.org/numpy/ticket/1770

Sorry to ask, and I ask partly because I'm in the middle of a py3k
port, but is this the right fix to this problem?  I was confused by
the presence of the old PyString_AsString function.

Best,

Matthew


More information about the NumPy-Discussion mailing list