簡體   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