Retrofitting spatial safety to lines of C++

Terminology: Spatial vs Temporal Memory Safety

  • Several comments clarify that “spatial memory safety” is long-standing security/PL jargon for out-of-bounds access, contrasted with “temporal memory safety” (use-after-free, lifetime issues).
  • Some C++ programmers say they’ve never heard the term; security and PL folks say it’s been standard in their circles for 10+ years.
  • The terminology is increasingly used in C++–Rust discussions to separate bounds issues from lifetime issues.

How Big a Problem Is Memory Safety?

  • One side stresses industry data: historically ~70% of vulnerabilities in systems like Android were memory-safety related, dropping sharply as more memory-safe languages are adopted.
  • Another side argues that OWASP’s top web vulnerabilities are not memory-safety-related and claims Rust advocates overstate memory safety as the dominant security problem.
  • Counterargument: web apps don’t use C++ much precisely to avoid memory-safety risks; memory safety is still a massive, distinct bug class and is widely recognized by major security organizations.

Bounds Checking and C++ (std::span, gsl::span, flags)

  • Strong support for bounds checking as a big practical win; D added it ~20 years ago, game engines and alternative C++ libraries (EASTL, Unreal) commonly use checked containers.
  • Debate over std::span:
    • It’s not bounds-checked by default per the C++ standard.
    • Some implementations (libc++ hardening, debug modes) can enable checks via non-portable flags; gsl::span is cited as always-checked.
    • Critics say “unsafe by default + toolchain flags” is insufficient; defenders argue it’s analogous to enabling optimizations.
  • There’s frustration that enabling bounds checks in C++ is harder and less standardized than flipping a single “build type” switch.

C++ Standards, Safety, and Compatibility

  • Some argue the C++ committee has historically prioritized backward compatibility and performance over safety, leading to “wrong defaults” like unchecked standard containers.
  • Safety advocates want “safe by default, opt-in to unsafe”; others say memory safety should be one of many bug classes handled via tests, analysis, and disciplined coding.

Libc++ Hardening in Production

  • Google’s hardened libc++ mode is described as newly practical for production, with low average overhead (~0.3%).
  • Enabling it in production, not just tests/debug, reportedly exposed many previously undetected spatial bugs.