如何显式检查numba cfunc的签名?

问题描述

例如,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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...