繁体   English   中英

如何在 Rust 的 function 堆栈上放置 C 结构?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM