01Initialization
Uninitialized reads are among the cheapest defects to write and among the most expensive to diagnose. An initialization profile makes them ill-formed: every object is initialized before it is read, a user-provided constructor must initialize every member, and the static initialization order fiasco becomes a compile error. Where raw storage is required, the hole is named.
02Bounds, and default-deny
A memory-safety profile starts from default-deny: an access is invalid unless the compiler can prove it belongs on the whitelist. When vector’s operator[] carries the bounds rule, every caller inherits the guarantee without annotating the call.
03Compile-time diagnosis of the common cases
“Unprovable in the general case” is not the same as “unaddressable in the cases that dominate production.” Profiles target what the compiler can see. Those cases become ill-formed. The residue is enumerated and handled as runtime.
04Incremental adoption on existing code
Profiles are adopted per translation unit. There is no flag day, and the annotations that are required are local, verifiable, and do not change semantics. A project can enforce initialization in new files this week and leave a device driver on a recorded suppress until it is ready.
05Named suppression
Safety that cannot be locally waived is safety that will be globally disabled. A suppress is named, scoped, and carries a recorded justification. The hole is greppable. Silence is not a dialect.
06Runtime checking for the remaining core-language UB
For the runtime-checkable residue, a profile enumerates the cases, owns the check, and owns the response. The argued default is termination. Continuation past core-language undefined behavior is not the portable guarantee. The goal is not merely to avoid executing past undefined behavior but to eliminate it, which requires that the checks themselves cannot be optimized away by the undefined behavior they guard.
07A first-class framework, not a configuration preset
A profile attests that these rules hold, or the program is ill-formed / does not proceed. That is a different object from a named bundle of switches over someone else’s machinery. A preset only selects from available settings; an attestor can reject the whole program.
08Localizing the annotation burden
Library authors do the local work once; applications consume it. The annotations belong in a few specific places: constructors that must initialize every member, bounds checks inside operator[], and lifetime transitions at the allocator boundary.
09One meaning across implementations
A profile is a portable language rule. The same source, under the same profile, is intended to be ill-formed or well-formed regardless of which vendor compiled it. If two implementations can disagree about whether a safety rule held, users have a vendor option, not a rule.