Prevent unwinding past FFI boundaries by diwic · Pull Request #46833 · rust-lang/rust (original) (raw)
We can emit the trap on functions with non-Rust ABI.
As @arielb1 said above, the "foreign item" check is not relevant here.
We should permit such functions to have a #[unwind] attribute, which would suppress the trap.
Ok, so I think we're mostly on the same page w r t what needs to be done. I rebased it on top of master and skipped the "common helper" part.
Note though that this is a change in behavior -- albeit only quasi-defined behavior -- and it feels like it ought to go through the RFC process. Still, it'd be good to have a working implementation so that we can do a crater run and assess possible impact.
Hmm, so I was thinking "what could this possibly break" and came up with this contrived example:
extern "C" fn foo(called_from_rust: bool) {
if something_really_bad_happens() {
if called_from_rust { panic!("Oh no"); }
else { std::process::abort() }
}
}
But even in this case; looking at the LLVM IR, we mark this function as nounwind
today (not sure why - the "foreign item" check should be false so unwind should have been added?) - so even if this code seems to work in practice, it's UB in theory because we're unwinding from a nounwind function.
EDIT: So what I wanted to say - is this ever a change in behavior where the previous behavior was not UB?