--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: gcc-4.7: Fail to build functional python/numpy extension
- From: Raphael Plasson <rplasson@gmail.com>
- Date: Tue, 07 Aug 2012 17:04:07 -0400
- Message-id: <20120807210407.12855.78458.reportbug@Dixie.rowland.org>
Package: gcc-4.7
Version: 4.7.1-6
Severity: normal
When building a C extension to Python that uses Numpy (more precisely that tries
to access a Numpy array from C), the resulting module segfaults when used. I
spent some time figuring out what was the origin of the problem (similar extension
I wrote did work in the past), and the problem is solved when compiling the
module with olde gcc version (both gcc-4.5 and gcc-4.6 did build functional modules,
I couldn't install older version of gcc-4.7 for further testing), so I assume there
is a problem with this version for compiling numpy modules.
Here is an minimal example, I hope it can reproduce the bug (and that the fault is
not from my code, sorry if it is the case...). It works correctly when compiled
with gcc-4.[56], and segfaults when compiled with gcc-4.7. It can be compiled by:
gcc-4.[5-7] -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c essai.c -o essai.o -march=native -g0
gcc-4.[5-7] -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro essai.o -o essai.so
(the compile options are as automatically generated by distutils stuff).
For testing it, you can simply do on a python shell:
>>> from essai import func
>>> import numpy as N
>>> x = N.zeros((10,10))+1.
>>> func(x,4)
It should return 25.25. It segfaults during the PyArray_ContiguousFromObject call (when
getting access to the numpy array from C).
Here is the code:
#include <Python.h>
#include <stdio.h>
#include <numpy/arrayobject.h>
static char func_doc[] = "func(data, val)\n";
static PyObject* func(PyObject *self, PyObject *args)
{
PyObject *input;
PyArrayObject *data;
double res=1.;
int val;
int i,j;
if (!PyArg_ParseTuple(args, "Ol", &input, &val)) return NULL;
data = (PyArrayObject *) PyArray_ContiguousFromObject(input, PyArray_DOUBLE, 2, 2);
if (data == NULL) return NULL;
for (i = 0; i < (int) data->dimensions[0]; ++i)
for (j = 0; j < (int) data->dimensions[1]; ++j)
res += ((double *)data->data)[i + j*data->dimensions[0]];
res /= val;
return Py_BuildValue("d", res);
}
static PyMethodDef module_methods[] = {
{"func", func, METH_VARARGS, func_doc},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initessai(void)
{
Py_InitModule("essai", module_methods);
import_array();
}
-- System Information:
Debian Release: wheezy/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.4-trunk-amd64 (SMP w/24 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages gcc-4.7 depends on:
ii binutils 2.22-7.1
ii cpp-4.7 4.7.1-6
ii gcc-4.7-base 4.7.1-6
ii libc6 2.13-35
ii libgcc1 1:4.7.1-6
ii libgmp10 2:5.0.5+dfsg-2
ii libgomp1 4.7.1-6
ii libitm1 4.7.1-6
ii libmpc2 0.9-4
ii libmpfr4 3.1.0-5
ii libquadmath0 4.7.1-6
ii zlib1g 1:1.2.7.dfsg-13
Versions of packages gcc-4.7 recommends:
ii libc6-dev 2.13-35
Versions of packages gcc-4.7 suggests:
pn binutils-gold <none>
pn gcc-4.7-doc <none>
pn gcc-4.7-locales <none>
ii gcc-4.7-multilib 4.7.1-6
pn libgcc1-dbg <none>
pn libgomp1-dbg <none>
pn libitm1-dbg <none>
pn libmudflap0-4.7-dev <none>
pn libmudflap0-dbg <none>
pn libquadmath0-dbg <none>
-- no debconf information
--- End Message ---
--- Begin Message ---
- To: Raphael Plasson <rplasson@gmail.com>, 684214-done@bugs.debian.org
- Subject: Re: Bug#684214: gcc-4.7: Fail to build functional python/numpy extension
- From: Matthias Klose <doko@debian.org>
- Date: Mon, 10 Sep 2012 16:25:22 +0200
- Message-id: <504DF852.9050106@debian.org>
- In-reply-to: <20120807210407.12855.78458.reportbug@Dixie.rowland.org>
- References: <20120807210407.12855.78458.reportbug@Dixie.rowland.org>
On 07.08.2012 23:04, Raphael Plasson wrote:
> static PyObject* func(PyObject *self, PyObject *args)
> {
> PyObject *input;
> PyArrayObject *data;
> double res=1.;
> int val;
> int i,j;
>
> if (!PyArg_ParseTuple(args, "Ol", &input, &val)) return NULL;
your code is wrong. you pass an int, but parse a long.
--- End Message ---