[Cython] Control Flow

Vitja Makarov vitja.makarov at gmail.com
Sat May 28 16:58:21 CEST 2011


2011/5/28 Stefan Behnel <stefan_ml at behnel.de>:
> Vitja Makarov, 28.05.2011 14:12:
>>
>> 2011/5/28 Stefan Behnel:
>>>
>>> Ok, I think we're done then, right? Anything else to do before merging it
>>> back?
>>
>> I hope so ;)
>
> I gave your branch a test with lxml and it spit out a couple of missing
> initialisation warnings. Most of them were due to the usage of C out
> arguments, e.g.
>
>    cdef Py_ssize_t step
>    ...
>    _PyEval_SliceIndex(sliceobject.step, &step)
>
> Here, it doesn't matter that "step" isn't initialised. I guess it's still ok
> to get a warning, since it's not obvious that "step" will always be set by
> the function call.
>
> Similarly:
>
>    cdef void _receiveXSLTError(void* c_log_handler, char* msg, ...) nogil:
>        cdef cstd.va_list args
>        ...
>        cstd.va_start(args, msg)
>
> Cython now tells me that "args" isn't initialised. That's true again,
> although this is an even more special case here. I guess I'll have to live
> with that as well for now, maybe until there's dedicated va_list support in
> Cython.
>
> Next, I got a crash in a part of code where I was manually releasing the
> GIL, but only conditionally, and Cython figured out that a variable wasn't
> initialised in one case and injected an exception. I would have liked to get
> a compile time warning here, but didn't. I assume that's because it was only
> a "may be used uninitialised", not a "is used uninitialised"?
>
> I'm currently looking through the other issues. A major problem is that I
> often relied on Cython setting uninitialised variables to None, especially
> in performance critical code where I wanted to avoid double initialisations.
> Cython is smarter now, so this needs fixing in the code. I'm sure I'm not
> the only one who'll run into that, so more warnings would be very helpful.
>

Do you run cython as "cython -Wextra"?
 -Wextra enables "maybe uninitialized" warning and unused entry.
By default error is generated for uninitialized pyobject variables and
warning for ctypes.

-- 
vitja.


More information about the cython-devel mailing list