是否有安全的替代方法来替换原始指针的不安全 slice::from_raw_parts?
Is there a safe alternative to replace the unsafe slice::from_raw_parts for raw pointers?
我有一个 Rust 动态库,可以从任何语言调用。导出函数的参数是两个 char *
内存指针和每个内存块的两个长度。
问题是 from_raw_parts
减少为一个 memcpy,并且如果长度错误,可能会以各种危险的方式出现段错误。然后我在切片上使用 bincode::deserialize
将它们用作 Rust 对象。有没有更安全的方法来处理传入的内存原始指针?
没有
你问的没有意义。在某种程度上,Rust 语言 存在的全部原因是因为原始指针本质上是危险的。 Rust 的引用(及其相关的生命周期)是一种执行编译时检查的结构化方式,以确保指针有效且可以安全使用。
一旦您开始使用原始指针,编译器就无法再帮助您处理这些指针,现在需要您来确保安全。
from_raw_parts
reduces to a memcpy
这似乎不正确。不应复制内存来创建切片。一个 Rust 切片实际上只是一对 (pointer, length)
— 与您分别传入的相同的东西。我希望每个都是寄存器大小的,所以调用 memcpy
会有点矫枉过正。
使用生成的切片 可能涉及复制数据,但这不再是由于 from_raw_parts
。
我有一个 Rust 动态库,可以从任何语言调用。导出函数的参数是两个 char *
内存指针和每个内存块的两个长度。
问题是 from_raw_parts
减少为一个 memcpy,并且如果长度错误,可能会以各种危险的方式出现段错误。然后我在切片上使用 bincode::deserialize
将它们用作 Rust 对象。有没有更安全的方法来处理传入的内存原始指针?
没有
你问的没有意义。在某种程度上,Rust 语言 存在的全部原因是因为原始指针本质上是危险的。 Rust 的引用(及其相关的生命周期)是一种执行编译时检查的结构化方式,以确保指针有效且可以安全使用。
一旦您开始使用原始指针,编译器就无法再帮助您处理这些指针,现在需要您来确保安全。
from_raw_parts
reduces to a memcpy
这似乎不正确。不应复制内存来创建切片。一个 Rust 切片实际上只是一对 (pointer, length)
— 与您分别传入的相同的东西。我希望每个都是寄存器大小的,所以调用 memcpy
会有点矫枉过正。
使用生成的切片 可能涉及复制数据,但这不再是由于 from_raw_parts
。