[Cython] cython tests and py3k hash randomization

Vitja Makarov vitja.makarov at gmail.com
Sat Feb 25 12:12:18 CET 2012


2012/2/24 Vitja Makarov <vitja.makarov at gmail.com>:
> 2012/2/24 Stefan Behnel <stefan_ml at behnel.de>:
>> Vitja Makarov, 24.02.2012 06:24:
>>> 2012/2/24 mark florisson <markflorisson88 at gmail.com>:
>>>> On 23 February 2012 20:52, Vitja Makarov <vitja.makarov at gmail.com> wrote:
>>>>> Recent py3k version has new feature "hash randomization" it solves
>>>>> some security issues.
>>>>> But has some drawbacks, for instance, dict.items() order is now
>>>>> unknown. So it breaks
>>>>> randomly some doctests that rely on exact order of dict items.
>>>>>
>>>>> vitja at mchome:~/python$ ./py3k/bin/python -c  "print({'a':1, 'b':2})"
>>>>> {'b': 2, 'a': 1}
>>>>> vitja at mchome:~/python$ ./py3k/bin/python -c  "print({'a':1, 'b':2})"
>>>>> {'a': 1, 'b': 2}
>>>>>
>>>>> As a workaround we can set PYTHONHASHSEED environment variable to zero
>>>>> for all cyhon-*-tests targets
>>>>>
>>>>> This also affects generated code it internally depends on order of
>>>>> items returned by dict.items()
>>>>
>>>> Any code or test that relies on dictionary order is wrong, really. So
>>>> I assume any pyregr issues will be fixed by the CPython test suite?
>>
>> Definitely.
>>
>
> Ok, I'll take a look.
>
>>
>>>> If there are any such failing tests in Cython we should simply fix them.
>>>
>>> Yes, you're right but I'm not sure how many tests may be broken. I
>>> don't think we want to fix them before release. Now I've added
>>>
>>> # Disable python hash randomization
>>> export PYTHONHASHSEED=0
>>>
>>> to cython-devel-tests and it worked.
>>
>> That should only be a work-around until all tests are fixed, though.
>>
>>
>>> It's not that easy to fix, here is simple doctest:
>>>
>>> def test_foo():
>>>     """
>>>     >>> test_foo()
>>>     {'a': 1, 'b': 2}
>>>     """
>>>     return {'a': 1, 'b': 2}
>>>
>>> You can't use dicts in doctests anymore there are few options instead:
>>> 1. Compare sorted items(), e.g. sorted(test_foo().items())
>>> 2. Inplace compare test_foo() == {...}
>>
>> I always use 1) because it gives you better test failure output in doctests.
>>
>

I fixed tests.

-- 
vitja.


More information about the cython-devel mailing list