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