blob: b0a1221107e7f9fee701638a0df61abaa67f1576 [file] [log] [blame] [view]
# C++ nullability analysis
Annotating C++ API boundaries with nullability information can improve their
Rust bindings (e.g. binding non-null pointers as `T&` rather than `Option<T&>`).
This directory has tools for C++ codebases that use such annotations:
- **Nullability inference** suggests annotations to add to APIs, by analyzing
the code that implements and uses them.
- **Nullability verification** verifies that annotated APIs are used and
implemented safely, e.g. checking nullable pointers before dereferencing them.
This is a local analysis suitable for use in a clang-tidy check.
They use Clang, its [dataflow framework][], and its [nullability annotations][].
## Style
This directory mostly uses [LLVM-style][] C++, rather than Google-style C++ used
in the rest of `crubit/`. The goal is to make it easy to upstream into
clang-tidy once mature.
Specifically:
- We follow the LLVM coding standards, with the exceptions listed here.
- We use absl `CHECK()` rather than `assert()`.
(This finds bugs more reliably, and is trivial to migrate later.)
- We otherwise avoid relying on absl, using llvm's Support libraries instead.
- We write `// TODO` instead of `// FIXME`.
This list isn't set in stone: we can choose to diverge further from LLVM style,
if it's worth more cost of upstreaming later.
[dataflow framework]: <https://github.com/llvm/llvm-project/tree/main/clang/include/clang/Analysis/FlowSensitive>
[nullability annotations]: <https://clang.llvm.org/docs/AttributeReference.html#nullability-attributes>
[LLVM-style]: <https://llvm.org/docs/CodingStandards.html>