mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-04-24 16:42:36 +02:00
29 lines
722 B
Markdown
29 lines
722 B
Markdown
# Calling External Code
|
|
|
|
Functions from other languages might violate the guarantees of Rust. Calling
|
|
them is thus unsafe:
|
|
|
|
```rust,editable
|
|
extern "C" {
|
|
fn abs(input: i32) -> i32;
|
|
}
|
|
|
|
fn main() {
|
|
unsafe {
|
|
// Undefined behavior if abs misbehaves.
|
|
println!("Absolute value of -3 according to C: {}", abs(-3));
|
|
}
|
|
}
|
|
```
|
|
|
|
<details>
|
|
|
|
This is usually only a problem for extern functions which do things with pointers which might
|
|
violate Rust's memory model, but in general any C function might have undefined behaviour under any
|
|
arbitrary circumstances.
|
|
|
|
The `"C"` in this example is the ABI;
|
|
[other ABIs are available too](https://doc.rust-lang.org/reference/items/external-blocks.html).
|
|
|
|
</details>
|