Please, let’s not add more keywords for the same concept. I think it would only cause more confusion. I still remember when I first learned about unsafe in Rust — and it wasn’t anything remotely hard to understand, but I would have found it pretty annoying if I had had to memorize two different keywords instead of one.
This is because unsafe actually has one very clear and specific meaning: “doing this is dangerous because many of Rust’s safety rules are not enforced”.
Now the “doing this” part can be different – it can be an FFI function call, it can be dereferencing a raw pointer, it can be the creation of a string from bytes that are not verified to be UTF-8, it can be any expression, really. But exactly what kind of expression is unsafe doesn’t really matter — it’s the same concept all the way down. An unsafe function is unsafe because it requires preconditions that the compiler can’t verify. This is true whether you are implementing the function, “looking from the inside out”, or calling it, “looking from the outside in”.
And an unsafe block communicates the identical issue, too: “there’s stuff in this block that is not verified by the compiler, so you need to be extra careful”.
I don’t think there’s a fundamental difference between function declarations, calls to unsafe functions, or any other unsafe expression in this regard – they are two (or three, or however many you can think of) aspects of the exact same issue: the compiler averts its eyes and lets you do several dangerous things.