I'm just waiting until it starts refusing to talk about `fsck` because it thinks checking a file system is rude - we should always politely assume that our file system is fully operational and not make it anxious with our constant pestering.
For example: Rust has destructors (Drop trait) that run automatically when a value goes out of scope or is overwritten. If memory for a struct with a Drop trait is manually allocated (and initialized with garbage) and it is assigned to, the `drop()` method will run for the previous value of it which will cause undefined behavior.
That's just one feature: Rust also has references, tagged unions, virtual method calls (&dyn Trait), move semantics, `Pin<T>`, closures, async/await, and many more, all of which make it harder to reason about safety without the guardrails provided by the language for regular, "safe" code—for which barring a compiler bug it is actually _impossible_ to shoot yourself in the foot like this.
This is actually why it's so incredibly hard to write C++ code that is provably correct: It has even more features that could cause problems than Rust, and is _always_ in "unsafe" mode, with no guardrails.
you can do tagged unions with cpp tricks, and so-on
(sadly I have seen most of these used...)
regardless, what makes C hard is undefined behaviour
If I asked Gemini about magic quotes in PHP[3] I'm fine with it explaining why that's a terrible idea - but it should also show me the safest path to utilize them.
1. Languages are turing complete - nothing is an absolute - etc... so "required" is a really strong word here and inaccurate - there were alternatives but they were much less elegant and clean.
2. -ish... I was a pretty junior developer at the time.
Some people won't follow the advice, but that's what code review and static analysis tools are for.