# Memory Safety

This page attempts to document the soundness properties of Crubit itself, as a
layer on top of existing C++ APIs.

## C++ interfaces

**Crubit does not guarantee that its bindings are sound.** Nor could it.
Instead, it makes the following assumptions:

1.  Functions which are not marked `CRUBIT_UNSAFE` only require validity of
    their parameters for safety. Such functions will not require `unsafe`.

2.  Rust moves of an object that we consider Rust-movable produces a valid
    object with the same state. A Rust move of such an object does not cause UB
    in C++.

When these are not true of the C++ functions, then the corresponding Rust
functions will be unsound. This can be fixed by marking types as `CRUBIT_UNSAFE`
(when they logically entail certain preconditions for validity, such as
lifetime), or by marking individual functions as `CRUBIT_UNSAFE`.

## Build Environment

The C++/Rust interfaces that Crubit sees **must** be ABI-compatible with the
real C++/Rust interfaces. To ensure this, Crubit requires the following of the
build environment:

*   The wrapped libraries are built using the same version of the compiler that
    Crubit uses, with the same compilation settings (flags, environment
    variables, etc.). For example, an extra `-DSOME_DEFINE` or a new version of
    the compiler can completely change the ABI, or even the API, of a given
    library. If the compiler sees it, but Crubit does not, the generated
    bindings will be incorrect.
    *   In particular, Crubit's outputs (*e.g.* `..._cc_api.h` or
        `..._rs_api.rs`) are not stored in a source code repository, as they
        *will* go out of date. Crubit comes with Bazel integration support to
        invoke it at build time.
*   The ABI must be deterministic and reproducible (*i.e.* depend only on
    compilation settings, the compiler version, and the wrapped libraries
    themselves). For example, the
    [`-Zrandomize-layout`](https://github.com/rust-lang/compiler-team/issues/457)
    flag cannot be used without a fixed seed.
