[Cython] Bug in C code generation
Ulf Worsoe
ulf.worsoe at mosek.com
Wed Apr 30 12:45:50 CEST 2014
Hi,
I have encounterered a bug in the following situation with Cython 0.20.1:
cdef funname():
cdef numpy.ndarray[numpy.int32_t,ndim=1] myvar
if True:
... block that never initializes myvar
else
... block that initializes myvar
The resulting C code does not declare the variable for the buffer object of
myvar (my guess is that cython detects that it is never used and drops it),
but the cleanup part of the C function contains code that frees the buffer,
and thus refers to a variable that was never declared.
I have not posted the complete code since the .pyx is around 50k lines
long, but the offending method looks like this, and the problematic
variable is _3_perm in line 4:
---------------
cdef _toStringArray__3JJ_3S(self,numpy.ndarray[numpy.int64_t,ndim=1]
_0_subi,numpy.int64_t _1_dstidx,numpy.ndarray[object,ndim=1] _2_result):
assert _0_subi is None or isinstance(_0_subi,numpy.ndarray)
assert _2_result is None or isinstance(_2_result,numpy.ndarray)
cdef numpy.ndarray[numpy.int64_t,ndim=1] _3_perm
cdef numpy.float64_t _4_c
cdef numpy.int32_t _5_b
cdef numpy.int32_t _6_ni
cdef numpy.int64_t _7_i
cdef numpy.int32_t _8_p
cdef mosek_fusion_Utils_StringBuffer _9_sb
for _10_i in xrange(0,(_0_subi).shape[0]):
if ((_0_subi[_10_i] < 0) or (_0_subi[_10_i] >= (self.shape.size))):
raise mosek_fusion_IndexError_ctor_S("Constraint index out of
bounds")
if (((_0_subi).shape[0] + _1_dstidx) > (_2_result).shape[0]):
raise mosek_fusion_LengthError_ctor_S("Result array is too small to
hold the result")
_9_sb=mosek.fusion.Utils.StringBuffer()
_8_p=0
if True:
for _11_k in xrange(0,(_0_subi).shape[0]):
_7_i=_0_subi[_11_k]
_6_ni=self.nativeindexes[_7_i]
_5_b=_8_p
while ((_8_p < ((self.cache.subi)).shape[0]) and
((self.cache.subi)[_8_p] == _7_i)):
_8_p += 1
_9_sb._clear_()._a_S(self.name)._a_S("[")._a_S(self.shape.indexToString(_7_i))._a_S("]
: ")
for _12_j in xrange(_5_b,_8_p):
_4_c=(self.cache.cof)[_12_j]
if (_4_c > 0):
_9_sb._a_S(" + ")._a_D(_4_c)._a_S(" ")
elif (_4_c < 0):
_9_sb._a_S(" - ")._a_D((- _4_c))._a_S(" ")
self.model._nativeVarToStr_ILmosek_4fusion_4Utils_4StringBuffer_2((self.cache.subj)[_12_j],_9_sb)
if (self.cache_bfix != None):
if (self.cache_bfix[_7_i] > 0):
_9_sb._a_S(" + ")._a_D(self.cache_bfix[_7_i])
elif (self.cache_bfix[_7_i] < 0):
_9_sb._a_S(" + ")._a_D(self.cache_bfix[_7_i])
_9_sb._a_S(" ")
self._domainToString_JLmosek_4fusion_4Utils_4StringBuffer_2(_7_i,_9_sb)
_2_result[(numpy.int64(_11_k) + _1_dstidx)] = _9_sb._toString_()
else:
_3_perm=numpy.zeros(((_0_subi).shape[0],),
dtype=numpy.dtype(numpy.int64))
mosek_fusion_CommonTools_argQsort__3J_3J_3JJJ(_3_perm,_0_subi,None,0l,(_0_subi).shape[0])
---------------
--
Ulf Worsøe
Mosek ApS
ulf.worsoe at mosek.com
www.mosek.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cython-devel/attachments/20140430/fcdb79dd/attachment.html>
More information about the cython-devel
mailing list