【发布时间】:2015-07-17 17:05:05
【问题描述】:
下面的示例代码
锈部分:
#[no_mangle]
pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 {
fun(value)
}
还有C部分:
int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t));
int32_t triple(int32_t x)
{
return x*3;
}
int main(int argc, char *argv[])
{
int32_t value = 3;
int32_t result = call_c_function(value, triple);
printf("%d tripled is %d\n", value, result);
call_c_function(0, NULL); // Crash here
return EXIT_SUCCESS;
}
call_c_function 的第二次调用当然会崩溃。
Rust 编译器不会抱怨 call_c_function 中的不安全代码,因为从 rust 的角度来看,这段代码是安全的。也不能简单写:
if !fun.is_null() {
fun(value)
}
因为fun 类型是fn(i32) -> i32(它不是指针)。
所以我的问题是,如何保护 call_c_function 免受 NULL 指针取消引用?有什么方法可以检查从 C 传递的回调是否无效?
也许我必须更改call_c_function 的定义?
【问题讨论】:
-
是的,只要检查 fun == NULL。或者为零,如果 NULL 不是生锈的东西。请注意,我不太了解 rust,但这就是您在 C 中的做法。
-
@Adrian Thx,这就是我要找的东西!