Das ist mir alles klar und das will ich auch nicht abstreiten, aber das Hauptproblem von C ist, dass es keine Möglichkeit gibt auf einen "sicheren" Modus umzuschalten wenn man mal nicht die letzten 2% Geschwindigkeit braucht. In 99% der Fälle in denen C verwendet wird, würde ein Speichercheck zur Laufzeit nicht weh tun, aber sehr viel zur Sicherheit beitragen. C ist optimiert auf einen Grenzfall, den man fast nie braucht.
Das ist der Unterschied zu Rust. Rust ist standardmäßig sicher, mit all den Nachteilen den das mit sich bringt. Aber man darf, wenn man muss, "unsichere" Operationen in unsafe{}-Blöcken durchführen, also Arrays wie in C als Zeiger interpretieren, allgemein mit nullbaren C-artigen Zeigern hantieren, oder komische typecasts machen etc.. Das vereinfacht die Sicherheitsprüfung ungemein. Ein "grep unsafe" über den Code reicht, um die Stellen zu finden, die man sehr genau angucken muss.
Rust benötigt im Gegensatz zu allen anderen Sprachen die C ersetzen wollen weder einen GC noch eine Laufzeitumgebung. Ersterer ist ähnlich die in C++ als smart_pointer in der Library implementiert und letztere kann man beim kompilieren ausstellen. Rust läuft wie schon erwähnt
ohne Probleme auf Mikrocontrollern (bis jetzt nur auf ARM).
Kleine Anmerkung: C ist selbst für embedded-Programmierung eigentlich nicht gut genug ist. Man muss sich oft mit häßlichen Makros helfen (C++ ist besser, aber templates werden sehr schnell sehr unleserlich wenn man vergleichsweise einfach Dinge tun will, sofern C++ überhaupt unterstützt wird, siehe PIC) die nicht Teil der Sprache, sondern stumpfes Suchen und Ersetzen durch den Preprocessor sind.