I would be more willing to blame C if these bugs were unsafe memory operations. Unused parameters, logic errors and assignment instead of comparison aren't unique to C and the language isn't without counter measures for them.
The X one is probably the only very C bug on the list and compiler warnings and/or a good static code checker would have found it.
I deliberately did not address unsafe memory operations, because the current widely-accepted state of the art for memory safety is garbage collection, which has significant overhead. I could have also tooted the horn for Rust (or Felix/BitC/Deca), but my goal was not to point out blank-slate solutions, but just how much of C itself could be trivially fixed.
Among others the Objective-C crowd might want to have a chat with you about it being the "widely-accepted state of the art." This is ignoring the fact that memory management does not really address C's ability to do unsafe memory operations as much as its just resource management.
I really should have said garbage collection + RAII. I'm not saying that GC is accepted by everyone, just among the people working in current memory-safe languages. (Or are you saying that ObjC does something even better that's yet to catch on?)
It's not so much about a language's ability to do unsafe memory operations, but the necessity of doing them to write useful code in the language.
The X one is probably the only very C bug on the list and compiler warnings and/or a good static code checker would have found it.