问题描述
例如,Numba提供了使用cfunc
创建快速C回调的功能
import numba as nb
@nb.cfunc("float64(float64)")
def fun(x):
return 2.0*x
此numba-cfunc
可在Cython中用于将C回调传递给包装的C代码/其他C功能,例如:
%%cython
ctypedef double(*f_type)(double)
# uses callback
cdef void c_print(double x,f_type f):
print(f(x))
def evaluate_and_print(double x,f):
# TODO: check signature of f
# it is not possible to cast a Python object to a pointer directly,# so we cast the address first to unsigned long long
c_print(x,<f_type><unsigned long long int>(f.address))
这适用于正确类型的cfunc
,即"float64(float64)"
。问题在于,上述内容也将与任何cfunc
对象一起工作,即具有错误签名的对象(例如"int64(int64)"
),从而在运行时使奇怪的事情/崩溃成为可能(但不能)引发Python异常)。
为说明问题,请考虑以下cfunc
:
import numba as nb
@nb.cfunc("int64(int64)")
def fun2(x):
return 2.0*x
现在可以传递给evaluate_and_print
:
evaluate_and_print(10,fun)
# 377110592.0
它不会崩溃,不会抛出,但是会产生一个奇怪的结果(无论在我的x64机器上,对%xmm0
进行调用后,fun2
-register中的值是什么)。显然,因为这是一个UB,所以对于其他功能/其他体系结构,可能会发生其他事情。
如何检查cfunc
对象是否具有正确的签名?
注意:可以使用_sig
对象的cfunc
属性进行比较,但是我想避免在这里使用私有API。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)