-1

我正在尝试使用 Rust 从 ISO 映像中读取内容。我已经在我的 Linux 机器上安装libiso9660-devlibcdio-dev访问头文件。Libiso9660是一个用于处理ISO9660文件系统(开发文件)的库。我使用bindgen生成到库的绑定。到目前为止,一切都非常简单。

这是与我的代码相关的绑定部分:

    extern "C" {
        pub fn iso9660_open(psz_path: *const ::std::os::raw::c_char) -> *mut iso9660_t;
    }

    extern "C" {
        pub fn iso9660_ifs_get_application_id(
            p_iso: *mut iso9660_t,
            p_psz_app_id: *mut *mut cdio_utf8_t,
        ) -> ::std::os::raw::c_uchar;
    }

下一步是使用生成的绑定。以下是相关代码:

    include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

    use std::os::raw::{c_char};
    use std::ffi::{CString};
    use std::ptr;

    pub fn open_image(path: &str) {
        let c_str = CString::new(path).unwrap();
        let psz_path = c_str.as_ptr() as *const c_char;
        let image = unsafe { iso9660_open(psz_path) };
        get_image_info(image);
    }

    fn get_image_info(image: *mut iso9660_t) {
        println!("Getting image info...");
        let ptr_null = ptr::null_mut();
        let app_info = unsafe { iso9660_ifs_get_application_id(image, ptr_null) };
        // here is the "segmentation fault (core dumped)"
    }

这是我想在 Rust 中复制的示例(第 89 行是我现在所在的位置)。

open_image似乎正在工作,但是当我调用 iso9660_ifs_get_application_id. 我假设我没有因为类型而调用该方法,但除此之外,我什么都没有。任何提示或帮助将不胜感激。谢谢!

4

1 回答 1

1

注意p_psz_app_id参数的类型:*mut *mut cdio_utf8_t。它是一个双指针。这是 C 示例代码正在执行的操作:

char *psz_str = NULL;
if (iso9660_ifs_get_application_id(p_iso, &psz_str)) {
  printf(title ": %s\n", psz_str);
}
free(psz_str);
psz_str = NULL;

它正在传递&psz_striso9660_ifs_get_application_id()函数。这里,&psz_str是一个指向空指针的有效指针psz_str;它本身不是空指针。Rust 代码为此参数传递了一个空指针,这就是问题所在。

于 2021-12-17T09:28:06.887 回答