G.SAF.FFI.01 FFI 边界应确保字符串参数正确传递和使用
【级别】 要求
【描述】
Rust 中字符串的表示采取了与 C 语言不同的方式。 Rust 字符串指针为宽指针,其中包含了字符串的起 始地址指针和字符串长度;而 C 语言中字符串指针为窄指针,仅包含起始地址,且字符串必须以 \0 结 尾。因此,不能直接使用 Rust 的 String
和 &str
类型与 FFI C 函数进行交互。
Rust标准库提供了两种与 C 语言字符串兼容的字符串类型: CString
和 CStr
。从 Rust 向 C 函数传递 字符串时应当向将字符串转换为 CString
类型,再用 .as_ptr()
方法获取 C 字符串指针。而在 Rust 中读取 C 函数返回的字符串指针,应该通过 CStr::from_ptr()
函数将其转换为 CStr 类型再读取。
CString
和 CStr
类型也提供了与 String
和 &str
类型之间的相互转换函数。
【正例】
Rust
use std::ffi::CString;
use std::os::raw::c_char;
extern "C" { fn greet(name: *const c_char); }
fn main() {
let name = "Rust";
let name = CString::new(name).unwrap();
unsafe { greet(name.as_ptr()) };
}