[英]How to place a C struct on the function stack in Rust?
我想转以下C代码
HMAC_CTX context;
HMAC_CTX_init(&context);
进入 Rust。 但是,虽然定义外部 function 很容易,但在 Rust 中直接使用 C 结构似乎是不可能的。
extern "C" {
use HMAC_CTX; // does not work!
fn HMAC_CTX_init(ctx: *mut HMAC_CTX);
}
我知道我可以在 Rust 中定义一个占位符结构
struct HMAC_CTX;
...但是一个实例可能没有足够的空间容纳真正的 C 结构。
let mut ctx = HMAC_CTX;
unsafe { HMAC_CTX_init(&mut ctx); }
有没有办法在不重新定义 Rust 中的整个结构的情况下解决这个问题? 这将创建从外部代码到我的 Rust 项目的依赖关系,我想避免这种情况。
使用rust-bindgen
生成 Rust 绑定。 如果放置在构建脚本中,它将生成相应 C 结构的 rust 版本并保持同步。
增加了构建过程的复杂性并增加了依赖。
手动创建 C 结构的 Rust 版本。
#[repr(C)]
pub struct HMAC_CTX {
md: *mut EVP_MD,
md_ctx: EVP_MD_CTX,
i_ctx: EVP_MD_CTX,
o_ctx: EVP_MD_CTX,
key_length: c_uint,
key: [c_uchar; 128],
}
这需要遵循 C 代码的更改并手动更新 Rust 结构。 还可能需要定义进一步的结构。 向被调用库的内部添加依赖项:-(
创建一个占位符结构。
pub struct HMAC_CTX {
_placeholder: [c_uchar; 256],
}
该结构需要足够大以容纳 C 结构的所有内部结构。 间接依赖:-( 如果 C 结构大小超过占位符大小,则可能导致不安全行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.