Skip to content

P.SAF.FFI.02 应正确处理 FFI 调用的返回值和输出参数

【描述】

在 FFI 调用场景下,应该对函数调用结果的错误异常进行正确处理。错误异常的常见形式有错误码返回值和空指针。

【反例】

Rust
/// 模拟一个外部 C 函数
#[no_mangle]
pub extern "C" fn alloc_huge_space() -> *mut libc::c_int {
  unsafe { 
    libc::malloc(u64::MAX.try_into().unwrap()) as *mut libc::c_int 
  } 
}

fn main() {
  let x = alloc_huge_space();
  let mut v = unsafe {
     std::slice::from_raw_parts_mut(x, 100) 
     }; 
  v[0] = 100;
}

【正例】

Rust
/// 模拟一个外部 C 函数
#[no_mangle]
pub extern "C" fn alloc_huge_space() -> *mut libc::c_int {
  unsafe { 
    libc::malloc(u64::MAX.try_into().unwrap()) as *mut libc::c_int 
  } 
}

fn main() {
  let x = alloc_huge_space(); 
  if !x.is_null() {
    let mut v = unsafe {
       std::slice::from_raw_parts_mut(x, 100) 
       };
    v[0] = 100;
  } 
}