- the ownership of your object (who is in charge of free-ing it) and the lifetime of the pointers that targets this object. (the whole ownership system & the borrow-checker)
- is some data-structure thread-safe. (the Send and Sync traits)
With those, you can take any Rust code and play with it without having to ask existential questions. Your code will never segfault or exhibit a strange intermittent bug ones you add multi-threading.
Less important but still really convenient on a daily basis:
- will this function mutate the value I give it. (&mut pointers)
- has this variable already been consumed, which means I should not touch it anymore (affine type)