Skip to content

G.SAF.FFI.01 FFI 边界应确保字符串参数正确传递和使用

【级别】 要求

【描述】

Rust 中字符串的表示采取了与 C 语言不同的方式。 Rust 字符串指针为宽指针,其中包含了字符串的起 始地址指针和字符串长度;而 C 语言中字符串指针为窄指针,仅包含起始地址,且字符串必须以 \0 结 尾。因此,不能直接使用 Rust 的 String&str 类型与 FFI C 函数进行交互。

Rust标准库提供了两种与 C 语言字符串兼容的字符串类型: CStringCStr。从 Rust 向 C 函数传递 字符串时应当向将字符串转换为 CString 类型,再用 .as_ptr() 方法获取 C 字符串指针。而在 Rust 中读取 C 函数返回的字符串指针,应该通过 CStr::from_ptr() 函数将其转换为 CStr 类型再读取。

CStringCStr 类型也提供了与 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()) };
}