On 4/30/2011 9:27 PM, Mark Wiebe wrote:
On Sat, Apr 30, 2011 at 9:11 PM, Christoph Gohlke <cgoh...@uci.edu
<mailto:cgoh...@uci.edu>> wrote:



    On 4/30/2011 6:37 PM, Charles R Harris wrote:
    >
    >
    >  On Sat, Apr 30, 2011 at 6:50 PM, Christoph Gohlke <cgoh...@uci.edu
    <mailto:cgoh...@uci.edu>
    >  <mailto:cgoh...@uci.edu <mailto:cgoh...@uci.edu>>> wrote:
    >
    >
    >
    >      On 4/30/2011 4:58 PM, Charles R Harris wrote:
    >  >
    >  >
    >  >  On Sat, Apr 30, 2011 at 5:53 PM, Charles R Harris
    >  > <charlesr.har...@gmail.com <mailto:charlesr.har...@gmail.com>
    <mailto:charlesr.har...@gmail.com <mailto:charlesr.har...@gmail.com>>
    >  <mailto:charlesr.har...@gmail.com <mailto:charlesr.har...@gmail.com>
    >  <mailto:charlesr.har...@gmail.com
    <mailto:charlesr.har...@gmail.com>>>> wrote:
    >  >
    >  > <snip>
    >  >
    >  >
    >  >          I get a null pointer access violation during numpy.test()
    >      with all
    >  >          msvc9/MKL builds for win32 (not win-amd64). The crash
    >      occurs during
    >  >          test_result_type() in test_numeric.py and can be reduced
    >      to the
    >  >          following code:
    >  >
    >  > > >> import numpy as np
    >  > > >> np.result_type(np.array([np.float32(0)]), np.complex128(0))
    >  >
    >  >          np.float64(0) and np.float16(0) also crash. Unfortunately
    >      the debug
    >  >          builds do not crash.
    >  >
    >  >      This is new, right?
    >  >
    >  >
    >  >  Does it depend on the optimization level?
    >  >
    >  >  Chuck
    >  >
    >
    >      Yes it's new. The pure msvc9 builds without MKL also crash.
    The crash
    >      disapperars When compiling with /Od (disable optimization)
    instead of
    >      /Ox (maximum optimization; the default for distutils).
    >
    >
    >  So all of np.float16(0), np.float32(0), np.float64(0), etc crash? Does
    >  it depend at all on 0 as the argument, or is it the same for 1, 0.0,
    >  etc. What about string arguments like np.float64("0"). I want to
    pin the
    >  location down a bit more. Too bad it doesn't crash in the debugger.
    >
    >  Chuck
    >

    Sorry, I should have been more precise. The crash occurs in
    `numpy.result_type(a, b)` with the following inputs:

    b = numpy.complex128(0)
    a = numpy.array([numpy.float16(0)])
    a = numpy.array([numpy.float32(0)])
    a = numpy.array([numpy.float64(0)])

    Christoph
    _______________________________________________
    NumPy-Discussion mailing list
    NumPy-Discussion@scipy.org <mailto:NumPy-Discussion@scipy.org>
    http://mail.scipy.org/mailman/listinfo/numpy-discussion


Can you try it with this commit backed out?

https://github.com/numpy/numpy/commit/fc0148bef18b8fd34d124d5edd90887f63e3bfce#L0R1147

What does the stack trace of the crash look like? Compiling with debug
information still works with optimizations, just the line numbers and
stack traces don't match the source as well.

<https://github.com/numpy/numpy/commit/fc0148bef18b8fd34d124d5edd90887f63e3bfce#L0R1147>-Mark



Sorry, I get no stack trace; apparently the stack is corrupted. I printf-debugged it down to the following preprocessor directive, which already caused trouble in gcc before <http://projects.scipy.org/numpy/ticket/1737>:

#if NPY_SIZEOF_LONGLONG >= NPY_SIZEOF_CLONGDOUBLE
    npy_longlong value;
#else
    npy_clongdouble value;
#endif

Replacing the two occasions of this code in multiarray/convert_datatype.c with `npy_longlong value[4];` solved the crash and all tests pass.

Btw, where is NPY_SIZEOF_CLONGDOUBLE defined? I searched the source code and the build directory but could not find it.

Christoph
diff --git a/numpy/core/src/multiarray/convert_datatype.c 
b/numpy/core/src/multiarray/convert_datatype.c
index 3359a55..4d76f97 100644
--- a/numpy/core/src/multiarray/convert_datatype.c
+++ b/numpy/core/src/multiarray/convert_datatype.c
@@ -1059,11 +1059,7 @@ PyArray_MinScalarType(PyArrayObject *arr)
         int swap = !PyArray_ISNBO(dtype->byteorder);
         int is_small_unsigned = 0;
         /* An aligned memory buffer large enough to hold any type */
-#if NPY_SIZEOF_LONGLONG >= NPY_SIZEOF_CLONGDOUBLE
-        npy_longlong value;
-#else
-        npy_clongdouble value;
-#endif
+        npy_longlong value[4];
         dtype->f->copyswap(&value, data, swap, NULL);
 
         return PyArray_DescrFromType(
@@ -1153,11 +1149,7 @@ PyArray_ResultType(npy_intp narrs, PyArrayObject **arr,
                 int swap = !PyArray_ISNBO(tmp->byteorder);
                 int type_num;
                 /* An aligned memory buffer large enough to hold any type */
-#if NPY_SIZEOF_LONGLONG >= NPY_SIZEOF_CLONGDOUBLE
-                npy_longlong value;
-#else
-                npy_clongdouble value;
-#endif
+                npy_longlong value[4];
                 tmp->f->copyswap(&value, data, swap, NULL);
                 type_num = min_scalar_type_num((char *)&value,
                                         tmp->type_num, &tmp_is_small_unsigned);
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to