I regularly have used more than one compiler (Borland, cc, early Microsoft, and one or two other proprietary ones for developing drivers for embedded optics controllers), programmed for more than one OS (Linux, a RTOS flavor of Linux, MS, Apple, AIX), and have seen my fair share of UB issues.
What you're referring to (programs and behaviors) is not what I was referring to (language details).
I don't understand how implementation-defined and undefined behavior are not a part of the language semantics. They're specified in the language standard, and they determine how the program code will be compiled. They're clearly part of the language.
The pretense that C is a simple language is equivocation, in my opinion.
There's an assumption that having fewer forms of abstraction, or fewer syntactic constructs, makes a language 'simple.' Certainly having to understand and choose between different forms of abstraction can make it difficult to use a language correctly, but the absence of that kind of complexity doesn't mean the language is necessarily simple.