C 到生锈,在生锈侧返回"pointer being freed was not allocated"



我正在尝试从 C 调用一些 Rust 代码并返回结果,但我在 Rust 端收到"未分配指针被释放"错误。

我想调用hex::encode函数。我传入一个指向一些字节的指针、长度和一个用 malloc 在 C 中分配的指针。我希望转换的结果在此指针上传递回。

Rust 函数:

extern crate libc;
use hex;
use std::ffi::CString;
use std::os::raw::c_char;
use std::vec::Vec;
use std::{ffi, ptr, slice};
#[no_mangle]
pub extern "C" fn bytes_to_hex_string(bp: *mut u8, bp_size: usize, sp: *mut c_char) -> i8 {
println!("1");
let p_vec = unsafe { Vec::from_raw_parts(bp, bp_size, bp_size + 1) };
println!("2");
let str = hex::encode(p_vec);
println!("3");
let bytes = str.as_bytes();
println!("4");
let cs = CString::new(bytes).unwrap(); // will fail if bytes has "gap" (null) in sequence
println!("5");
unsafe {
libc::strcpy(sp, cs.as_ptr());
}
println!("6");
return 1;
}

从此 C 代码调用:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int8_t bytes_to_hex( uint8_t *, unsigned int, char *);
int main() {
char *ptr = "Hello World!";
char *hex = (char *)malloc(1000);
printf("about to call....n");
bytes_to_hex_string((uint8_t*)ptr,strlen(ptr),hex); 
printf("about to print....n");
printf("%sn",hex);
printf("about to free....n");
free(hex);
}

当我运行程序时:

$ ./a.out
about to call....
1
2
a.out(2941,0x7fffccae03c0) malloc: *** error for object 0x10afe2b80: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

看起来十六进制箱内的 Rust 代码正在释放ptr指针,对吗?

有没有办法解决这个问题?我希望在 C 中进行分配和释放,但我愿意接受任何解决此问题的建议!

如果你不希望 Rust 释放你的指针,请不要使用拥有分配的类型。VecCString都拥有指针的所有权并对其进行管理。想必您对需要同时提供长度和容量感到惊讶?

请改用slice::from_raw_parts

extern crate libc;
extern crate hex;
use std::ffi::CString;
use std::os::raw::c_char;
use std::slice;
#[no_mangle]
pub unsafe extern "C" fn bytes_to_hex_string(bp: *mut u8, bp_size: usize, sp: *mut c_char) -> i8 {
let p_vec = slice::from_raw_parts(bp, bp_size);
let str = hex::encode(p_vec);
let cs = CString::new(str).unwrap();
libc::strcpy(sp, cs.as_ptr());
return 1;
}

我没有测试这个,所以我不能说你的strcpy是否正确。但是,FFI 函数中的恐慌是未定义的行为。同样令人惊讶的是,您将两个指针都声明为可变的......您也不需要导入Vec因为它在前奏中。

另请参阅:

  • Rust FFI Omnibus中的切片参数

相关内容

最新更新