It's not. All languages make trade-offs in the performance-convenience-safety-etc space, and Ada's choice is not "100% safety". It lacks memory safety and has holes in its type system: https://www.enyo.de/fw/notes/ada-type-safety.html
It's not. All languages make trade-offs in the performance-convenience-safety-etc space, and Ada's choice is not "100% safety". It lacks memory safety and has holes in its type system: https://www.enyo.de/fw/notes/ada-type-safety.html
Aside from simply making manual memory management less frequent (with things like variably sized arrays), it has memory pools and subpools to handle more large-scale memory safety issues. Essentially you can define the scope for all allocations of a type.
It's an interesting tradeoff, though unfortunately I haven't seen much discussion about it.
And even then, I don't think Rust's mechanisms even can be 100% as they are now.
Ada's pools are probably the one that is most related to Moore's Law and actually capable of 100%, or so I'd expect.
So I can write guards like
if(stack_allocated_ptr(thingie))
{
exit_critical_error( "oopies");
}