I am still incredibly confused by the following topics:
Undefined behavior
This is really the meat of my rant. Undefined behavior defies explanation, I think, by its very nature. At least the concept defies any attempt I make to internalize it. Being human, I want to believe that UB is fine as long as some-arbitrary-condition is met. I know this is untrue, but I still cannot come to terms with it.
Along with UB is the concept of unsoundness, which is (as far as I know) mostly unrelated but just as serious. Here's a cool cheatsheet!
Which segues into ...
unsafe
Because unsafe
allows innumerable ways to invoke undefined behavior, I too have learned to avoid it like the plague (very much the same as mentioned earlier by notriddle). I have even gone as far as making all of my crates #[forbid(unsafe_code)]
.
When I read articles like you can't turn off the borrow checker, the arguments made for unsafe
do give me that warm-and-fuzzy feeling for a fleeting moment. Then I remind myself just how awful it is to write anything at all in C, and it scares me back to reality.
I don't think this is necessarily a problem, but I'm sure it will cause me to miss out on something important some day...
Lifetimes
Reading about lifetimes makes my head hurt.
Pin
This is another tricky subject that is deceivingly simple! The devil is in the details. I can't even follow along with most conversations involving Pin
beyond the very basics. Topics like Pin
projection and unsoundness when combined with DerefMut
blew my mind. There's just no other way to put it.
All the parts of Rust that I haven't found a need for in my day-to-day
- HRTBs
- GATs
- Atomic fences and memory fences - especially which to use and when.
- Negative trait bounds - especially when they compose a double negative:
!Unpin
and specialization.