<br><br><div class="gmail_quote">On Fri, Oct 16, 2009 at 9:35 PM, Travis Oliphant <span dir="ltr">&lt;<a href="mailto:oliphant@enthought.com">oliphant@enthought.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div style="word-wrap: break-word;"><br><div><div class="im"><div>On Oct 15, 2009, at 11:40 AM, Michael Droettboom wrote:</div><br><blockquote type="cite"><div>I recently committed a regression test and bugfix for object pointers in <br>
record arrays of unaligned size (meaning where each record is not a <br>multiple of sizeof(PyObject **)).<br><br>For example:<br><br>        a1 = np.zeros((10,), dtype=[(&#39;o&#39;, &#39;O&#39;), (&#39;c&#39;, &#39;c&#39;)])<br>
        a2 = np.zeros((10,), &#39;S10&#39;)<br>        # This copying would segfault<br>        a1[&#39;o&#39;] = a2<br><br><a href="http://projects.scipy.org/numpy/ticket/1198" target="_blank">http://projects.scipy.org/numpy/ticket/1198</a><br>
<br>Unfortunately, this unit test has opened up a whole hornet&#39;s nest of <br>alignment issues on Solaris.  The various reference counting functions <br>(PyArray_INCREF etc.) in refcnt.c all fail on unaligned object pointers, <br>
for instance.  Interestingly, there are comments in there saying <br>&quot;handles misaligned data&quot; (eg. line 190), but in fact it doesn&#39;t, and <br>doesn&#39;t look to me like it would.  But I won&#39;t rule out a mistake in <br>
building it on my part.<br></div></blockquote><div><br></div></div><div>Thanks for this bug report.      It would be very helpful if you could provide the line number where the code is giving a bus error and explain why you think the code in question does not handle misaligned data (it still seems like it should to me --- but perhaps I must be missing something --- I don&#39;t have a Solaris box to test on).   Perhaps, the real problem is elsewhere (such as other places where the mistake of forgetting about striding needing to be aligned also before pursuing the fast alignment path that you pointed out in another place of code). </div>
<div><br></div><div>This was the thinking for why the code (that I think is in question) should handle mis-aligned data: </div><div><br></div><div>1) pointers that are not aligned to the correct size need to be copied to an aligned memory area before being de-referenced. </div>
<div>2) static variables defined in a function will be aligned by the C compiler. </div><div><br></div><div>So, what the code in refcnt.c does is to copy the value in the NumPy data-area (i.e. pointed to by it-&gt;dataptr) to another memory location (the stack variable temp), dereference it and then increment it&#39;s reference count.  </div>
<div><br></div><div>196:  temp = (PyObject **)it-&gt;dataptr;</div><div><div>197:  Py_XINCREF(*temp);</div></div></div></div></blockquote><div><br>Doesn&#39;t it-&gt;dataptr need to be copied to temp, not just assigned?<br>
<br>Chuck <br></div><br></div>