我在Kubuntu Trusty 64位上运行Python 3.4.0-0ubuntu2。
当试图为我的其他相关(但不是重复的)的question找到一个最小的示例时,我发现下面使用Python CTypes的简单代码在调用SIGABRT时会导致fn1。(注意,在另一种情况下,fn1工作正常,只有fn2不工作,信号在那里SIGSEGV。)
库c:

#include <stdio.h>

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;
}

主.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))

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

如果我把Union改成Structure也没什么区别。
中止的原因是什么?我该如何解决?谢谢。

最佳答案

这似乎是libffi(ctypes使用的)中的一个bug,只有在按值传递结构并且该结构的长度介于9-16字节之间时才会发生:https://bugs.python.org/issue22273
我能够在Python2.7上重现这一点。请尝试增大结构的大小或对方法使用指针参数。
不幸的是,直到现在这个问题似乎还没有解决

10-08 08:23
查看更多