使用Ruby FFI调用Rust lib时出现分段错误

xij*_*ijo 7 ruby ffi rust

我想传入String一个Rust lib,但它总是抛出一个分段错误.

这是代码:

 // lib.rs
 #[no_mangle]
 pub extern fn process(foo: String) -> String {
     foo
 }
Run Code Online (Sandbox Code Playgroud)

和Ruby文件:

 # embed.rb
 require 'ffi'

 module Hello
   extend FFI::Library
   ffi_lib 'target/release/libembed.dylib'
   attach_function :process, [ :string ], :string
 end

 puts Hello.process("foo")
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 6

免责声明:我之前从未使用过Ruby-FFI; 我正在继续我在文档中找到的内容.

根据类型Ruby-FFI wiki页面,:string相当于NUL终止的C字符串. 这是一样的防锈String.StringRust中的A (现在)大三倍!

Rust中相应的类型*const ::libc::c_char.值得注意的是,也有std::ffi::CString,这是专为创建C字符串,而std::ffi::CStr这是可以从创建的安全包装类型或者一个CString或一个*const c_char.请注意,这些都不兼容*const c_char!

总之,要处理Rust中的C字符串,您将不得不处理类型.还要记住,根据您实际尝试的操作,您可能还需要处理使用libc::malloc和手动管理内存libc::free.

这个"Rust FFI C字符串处理"的答案提供了有关如何处理Rust中C字符串的更多细节.虽然问题的上下文是与C代码集成,但在您的情况下它应该同样有用.

  • "Rust中的一个字符串(目前)大三倍!" 在技​​术上是正确的,因为String是一个指针和两个整数,`char*`是一个指针.但这并不意味着"lolfoobarthisisastring"在Rust中比在C中大三倍. (3认同)