A simplified model of Fil-C
Perceived role of Fil-C
- Seen by some as an underrated way to harden existing C/C++ code without a risky rewrite.
- Especially attractive for long-lived, battle‑tested C utilities where extra latency and memory are acceptable.
- Others stress that it targets a different niche than languages like Rust or Ada; not a general replacement.
Performance and overhead
- Widely acknowledged that Fil-C is “quite a bit slower” and uses more memory than native C or Rust.
- Authorial comments suggest an aspirational overhead in the ~20–30% range for many workloads, which some consider acceptable for the safety gained.
- Critics argue that if you accept that level of overhead, managed languages (Java, C#, Go) or rewrites may also be on the table.
Interop, platform constraints
- Major downside: Fil-C does not interoperate with non‑Fil‑C code, not even libc.
- This complicates use on non-Linux platforms and mixing with other safe languages or native APIs.
- Workarounds like an FFI to “unsafe C” are considered possible but intentionally avoided so far.
Runtime vs compile-time safety
- Fil-C enforces memory safety at runtime: unsafe operations crash instead of corrupting memory.
- Debate over whether “crash-only” behavior counts as memory safe; consensus is that it is, but crashes can still be DOS vulnerabilities.
- Compared to Rust: Rust moves many checks to compile time and allows some runtime failures to be caught and recovered (panics, unwinding), which Fil-C currently does not.
- Some suggest signals or exceptions could be used for recovery in principle, but this is not the current design.
Garbage collection and real-time aspects
- Fil-C includes a concurrent, on-the-fly GC; some C/C++ programmers are enthusiastic, others say GC is incompatible with their real‑time needs.
- There is discussion of potential to make the GC real‑time friendly with more engineering effort.
Hardware support, fat pointers, and techniques
- Fil-C uses techniques related to fat pointers and shadow memory (“InvisiCaps”), but is described as more than just fat pointers.
- Some commenters note hardware trends (CHERI, memory tagging, experimental object-memory hardware) that could accelerate such schemes.
- Others point out that fat-pointer-like schemes have often been rejected historically due to ABI and overhead issues.
Tooling, ecosystem, and alternatives
- Some expect improved C tooling and formal verification to erode Rust’s safety advantage over time; others are skeptical that “automatic” formal verification will be simple.
- Rust, Go, managed languages, and specialized formally-verified DSLs (e.g., WUFFS, SPARK-like systems) are all mentioned as alternative safety strategies with different tradeoffs.
- A Bazel template for Fil-C is shared to ease hermetic builds.
Critiques and limitations
- Fil-C is reported not to be memory safe under data races; capability and pointer fields can tear under concurrent writes, leading to misbehavior.
- Some worry that runtime-only safety, lack of interop, and slower performance limit Fil-C to narrow use cases.
- Others emphasize that recompiling existing code with Fil-C (with no large rewrite) is itself a major practical advantage.