Abortar al pasar la estructura Python CTypes que contiene una matriz de 3 ints

Estoy ejecutando Python 3.4.0-0ubuntu2 en Kubuntu Trusty 64 bit.

Cuando trato de encontrar un ejemplo mínimo para mi otra pregunta relacionada (pero no duplicada), encontré que el siguiente código aparentemente trivial que usa Python CTypes causa un SIGABRT en la llamada a fn1 . (Tenga en cuenta que en el otro caso, fn1 funcionó bien y solo fue fn2 que no funcionó y la señal era SIGSEGV allí).

lib.c:

 #include  typedef struct { int data[3]; } Triplet; void fn1(Triplet t) { fprintf(stderr, "%d, %d, %d\n", t.data[0], t.data[1], t.data[2]); } Triplet fn2(Triplet t) { Triplet temp = {{t.data[0] + 1, t.data[1] + 1, t.data[2] + 1}}; return temp; } 

main.py:

 from ctypes import * Array3 = c_int * 3 class Triplet(Union): _fields_ = [("data", Array3)] _lib = CDLL("libuniontest.so") _lib.fn1.argtypes = [Triplet] _lib.fn2.restype = Triplet _lib.fn2.argtypes = [Triplet] t = Triplet(Array3(99, 129, 39)) _lib.fn1(t) # this causes segfault tt = _lib.fn2(t) print(tuple(tt.data)) 

Makefile:

 test: $(CC) -fPIC -shared -o libuniontest.so lib.c sudo cp libuniontest.so /usr/local/lib/ sudo ldconfig python3 main.py 

No hizo una diferencia si cambié Union to Structure .

¿Cuál es la razón de este aborto y cómo puedo solucionarlo? Gracias.

Esto parece ser un error en libffi (que es lo que usa ctypes) que solo ocurre si se pasa una estructura por valor y esa estructura tiene entre 9 y 16 bytes de longitud: https://bugs.python.org/issue22273

Soy capaz de reproducir esto en Python 2.7. Intente boost el tamaño de la estructura o use un parámetro de puntero para los métodos.

Lamentablemente parece que esto no está arreglado hasta ahora.

    Intereting Posts