But yes, there's a level of indirection so that the meta-data is not stored as part of the pointer itself.
See here for a list of code examples demonstrating how typical memory-unsafe coding patterns are caught (including forging pointers):
As for Fil-C vs CHERI, in the author's own words:
"InvisiCaps can also be thought of as a software implementation of CHERI. Unlike CHERI, InvisiCaps are more compatible (pointers are 64-bit, not 128-bit or 256-bit) and InvisiCaps have a more deterministic use-after-free story."
As for Fil-C vs Rust: this is comparing apples and oranges. Fil-C is a compiler to make existing C/C++ codebases memory-safe with maximal compatibility in mind, Rust is a modern systems language. The approach is also widely different (runtime checks in Fil-C, versus the borrows checker typesystem in Rust).
KR,
Tom