From 24c1e109cc36d198c010722c80bb2b06efacabe7 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Sat, 20 Jun 2015 12:00:29 -0400 Subject: [PATCH] TRPL: FFI: address panics Fixes #26443 --- src/doc/trpl/ffi.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/doc/trpl/ffi.md b/src/doc/trpl/ffi.md index 54e850c051e8d..917d8dbe196c7 100644 --- a/src/doc/trpl/ffi.md +++ b/src/doc/trpl/ffi.md @@ -530,3 +530,37 @@ The `extern` makes this function adhere to the C calling convention, as discussed above in "[Foreign Calling Conventions](ffi.html#foreign-calling-conventions)". The `no_mangle` attribute turns off Rust's name mangling, so that it is easier to link to. + +# FFI and panics + +It’s important to be mindful of `panic!`s when working with FFI. This code, +when called from C, will `abort`: + +```rust +#[no_mangle] +pub extern fn oh_no() -> ! { + panic!("Oops!"); +} +# fn main() {} +``` + +If you’re writing code that may panic, you should run it in another thread, +so that the panic doesn’t bubble up to C: + +```rust +use std::thread; + +#[no_mangle] +pub extern fn oh_no() -> i32 { + let h = thread::spawn(|| { + panic!("Oops!"); + }); + + match h.join() { + Ok(_) => 1, + Err(_) => 0, + } +} +# fn main() {} +``` +