Rust FFI 错误模型:跨语言返回值语义设计

背景 这类问题在真实项目里很常见:高并发、复杂依赖、发布频繁、团队协作面广。只有把边界条件提前定义清楚,系统才会在压力下保持稳定。 实践要点 先定义目标:可用性、延迟、成本哪个优先。 把关键路径显式化:超时、重试、降级、回滚。 把策略写进代码和流程,而不是只停留在文档。 代码片段 let result = tokio::time::timeout( std::time::Duration::from_millis(200), do_work(), ).await; 总结 工程实践最怕“看起来正确”。把策略做成可观测、可验证、可回滚的闭环,才能在生产环境里真正稳定运行。 稳定性不是某个技巧,而是持续的系统化约束。

2026年5月23日 · 1 分钟 · BvBeJ

Rust FFI 零拷贝接口契约:布局、生命周期与错误边界

三个必须显式定义的契约 内存布局:#[repr(C)] 与对齐保证。 生命周期:谁分配、谁释放、何时失效。 错误语义:错误码与可恢复性边界。 最小安全接口 #[repr(C)] pub struct Buffer { pub ptr: *const u8, pub len: usize, } #[no_mangle] pub extern "C" fn process(input: Buffer, out: *mut Buffer) -> i32 { // 返回0表示成功,非0为错误码 0 } 工程建议 跨边界只传 POD 结构,复杂对象留在 Rust 内部。 为每个导出函数写 C 侧模糊测试样例。 开启 AddressSanitizer/UBSan 做集成测试。 小结 FFI 的性能上限由零拷贝决定,可靠性下限由契约决定。契约写清楚,性能和稳定性才能同时拿到。

2026年5月12日 · 1 分钟 · BvBeJ

Rust 与 C++ FFI 实战:先稳住边界再谈性能

场景 很多团队不是从零重写,而是把热点模块逐步迁到 Rust。最现实的路径是: C++ 主程序继续跑 Rust 提供一个动态库 双方通过 C ABI 通信 核心原则很简单:跨语言只传 C 兼容类型。 先定义稳定接口 #[repr(C)] pub struct CalcResult { pub code: i32, pub value: i64, } #[no_mangle] pub extern "C" fn calc_sum(a: i64, b: i64) -> CalcResult { CalcResult { code: 0, value: a + b } } #[repr(C)] 保证结构体布局可预测 extern "C" 保证调用约定一致 #[no_mangle] 让符号名可被 C++ 链接 字符串内存谁分配谁释放 跨边界最容易出问题的是字符串: Rust 分配、C++ 释放,或者反过来 不同分配器混用导致崩溃 推荐做法:统一由一侧分配和释放,并显式提供 free 函数。 错误处理不要 panic 穿透 FFI 层应该“防炸”: #[no_mangle] pub extern "C" fn safe_div(a: i64, b: i64, out: *mut i64) -> i32 { if out.is_null() { return -2; } if b == 0 { return -1; } unsafe { *out = a / b; } 0 } 返回错误码是最朴素、也最稳的方式。 ...

2026年4月19日 · 1 分钟 · BvBeJ