Perhaps terms like 'broken' and 'own fault' aren't helpful. C's adequate when used cautiously, but it does require considerable cognitive effort by the programmer. Optional tools like linters and so on are evidence too that C is inadequate, the constructs we strive to avoid could, should be prevented by the language itself, it should be hard to access illegal array elements, hard to write code that produces different outputs on different targets, easy to manipulate strings, easy to deal with exceptions, hard to overwrite memory and so on, but C makes it easy, too easy.And it does so in a very platform-specific way. Whereas C compiles to basically ANY kind of machine code.
Having said that, yes, assembler is a tool too. And if you want or have to implement something using that particular tool, that is fine. (Regarding that, I prefer the INTEL syntax over AT&T.)
I also do not agree that C is broken. In fact I am so confident of that, if something goes wrong in my code, I automatically know that it is my own fault. On the other hand, there are a lot of languages are truly "broken". (Did you know that no Java implementation can handle a function body consisting of more than 2^16 bytes? It's kludgy "generics" objects don't actually work very well either.)
IMHO, as an experienced compiler developer with huge experience of C, a language that makes these things easy, almost inevitable, is not well designed.