Skip to content

Commit 80d6b56

Browse files
committed
Auto merge of #1745 - hyd-dev:unsup-foreign-calls-are-not-ub, r=RalfJung
Improve error message of calling unsupported non-"C"/"system"-ABI foreign function Miri currently reports the following `foo()` call has ABI-mismatch UB: ```rust #[cfg(unix)] extern "Rust" { // or any non-"C" ABI fn foo(); } #[cfg(windows)] extern "C" { // or any non-"system" ABI fn foo(); } fn main() { unsafe { foo(); } } ``` [Output when targeting Linux](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=72afc3bd4d9fdab962422cfc2c5a2166) (and maybe also macOS): ``` error: Undefined Behavior: calling a function with ABI C using caller ABI Rust --> src/main.rs:13:9 | 13 | foo(); | ^^^^^ calling a function with ABI C using caller ABI Rust | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavio ``` Output when targeting Windows: ``` error: Undefined Behavior: calling a function with ABI system using caller ABI C --> <anon>:13:9 | 13 | foo(); | ^^^^^ calling a function with ABI system using caller ABI C | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior ``` However, to my knowledge, that's not UB -- it's just unsupported by Miri (and Miri can't assume the function has `"C"` or `"system"` ABI since Miri doesn't know about it). I believe that is because of the overzealous `check_abi()` call before the long `match` in `src/shims/{posix,windows}/foreign_items.rs`. The ABI is checked to match the system one (`"system"` on Windows, `"C"` otherwise) no matter the callee is recognized as a shim or an unsupported foreign function. Therefore, this PR removes the `check_abi()` call before the `match` and inserts a `check_abi()` call to each non-wildcard match.
2 parents 0788188 + 7ec919d commit 80d6b56

File tree

5 files changed

+152
-8
lines changed

5 files changed

+152
-8
lines changed

0 commit comments

Comments
 (0)