rust - GraphicsMagick FFI 问题

标签 rust ffi

作为练习,我尝试用 Rust 编写一个 GraphicsMagick FFI 包装器。我在复制一些引用 C 代码时遇到问题:

Demo C code :

Image
  *image = (Image *) NULL;
ImageInfo
  *imageInfo;
ExceptionInfo
  exception;

InitializeMagick(NULL);
imageInfo=CloneImageInfo(0);
GetExceptionInfo(&exception);

这是我对 Rust 的(天真的)翻译:

let img: *mut ffi::Image;
let img_info: *mut ffi::ImageInfo;
let exception: *mut ffi::ExceptionInfo = ptr::null_mut();
unsafe {             
  ffi::InitializeMagick(ptr::null_mut());
  img_info = 
    ffi::CloneImageInfo(ptr::null_mut() as *const ffi::ImageInfo);
  ffi::GetExceptionInfo(exception);
  // ...
}

这编译得很好,但是当我尝试运行它时,我看到:

magick/error.c:388: GetExceptionInfo: Assertion `exception != (ExceptionInfo *) ((void *)0)' failed

这是由 ffi::GetExceptionInfo(exception) 引起的。唯一的区别似乎是 C 异常没有被“初始化”,但我对 C 的了解还不够多,无法知道 null 和空/未初始化指针之间是否存在差异。

最佳答案

C 和 Rust 代码之间的区别在于 C 版本分配一个 ExceptionInfo 实例在堆栈上并传递到 GetExceptionInfo 一个引用该实例的指针。

另一方面,您的 Rust 代码传递了一个 NULL 指针。

GetExceptionInfo 专门防止被传递一个NULL 指针,你可以看到断言的代码here, in magick/error.c .

我不知道您使用的是哪种 FFI 绑定(bind),但如果 ExceptionInfo 已在其中完全定义,那么您应该能够在堆栈上分配它并传递对它的引用就像在 C 版本中一样:

let mut exception: ffi::ExceptionInfo = unsafe {std::mem::uninitialized()};
unsafe {ffi::GetExceptionInfo (&mut exception);}

关于rust - GraphicsMagick FFI 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33576978/

相关文章:

oop - 在 OOP Rust 中,值在构造函数和 setter 中的生命周期不够长

rust - 基于类型参数选择了错误的特征

rust - 非词汇生命周期借用检查器是否会过早释放锁定?

haskell - CPP : Macros in Haskell

c++ - 尝试将 C++ 绑定(bind)到 Haskell : getting undefined reference errors

rust - main.rs 和 lib.rs 共存时无法链接 C 库

io - 使用 Read::read_to_string 从 TcpStream 读取会挂起,直到连接被远程端关闭

c - C 枚举的大型 c2hs 推断大小

c++ - 调用Syscall函数时获取异常

objective-c - 在 Ruby 中通过 FFI 调用 Objective-C 选择器方法