Ist Rust wirklich sicher?
Ist C++ wirklich so unsicher?
Ich habe einen Vortrag zu einem interessanten Thema auf YouTube gefunden und bringe ihn hier mit.
Wenn man den Titel übersetzt, wirkt die Nuance etwa so: „Zu sagen, man solle einfach eine speichersichere Sprache verwenden, ist nicht so einfach.“
Der Vortragende äußert seine Gedanken aus einer vergleichsweise fairen, nicht einseitigen Perspektive.
- Rust verhindert durch Panics die Ausführung speicherunsicheren Codes, aber „unsafe Rust“ kann diese Schutzmechanismen umgehen.
- Allerdings erfordert unsafe Rust ein ausdrückliches Opt-in und fällt dadurch stärker auf als unsicheres C/C++. Dieser Teil kann gezielt überprüft werden.
- Etwa 30 % der Rust-Crates verwenden unsicheren Code, in Embedded-Systemen sogar doppelt so häufig.
- Sanitizer (dynamische Analysewerkzeuge) können Speicherfehler sowohl in Rust- als auch in C/C++-Code erkennen.
- 70 % der Rust-Entwickler rufen unsicheren Code über FFI (Foreign Function Interface) zu C/C++-Bibliotheken auf.
- Viele wichtige Bibliotheken, die auch in Rust-Projekten verwendet werden, sind in C/C++ geschrieben (SQLite, OPCUA-Bibliotheken).
- Sanitizer können Rust- und C/C++-Code auf der LLVM-IR-Ebene analysieren, sofern der Quellcode vorliegt.
- Miri ist ein ergänzendes Werkzeug, um undefiniertes Verhalten in Rust auf der Mid-level-Representation zu erkennen.
- Vorteile von Miri: Es liefert klare Fehler und prüft sämtliches undefiniertes Verhalten gleichzeitig. Einschränkung: Es kann C/C++-Code nicht interpretieren.
- Etwa 20 % der Funktionen der Rust-Standardbibliothek verwenden unsicheren Code.
- Kritische Infrastruktur braucht nicht nur speichersicheren Code, sondern korrekten Code, um Sachschäden oder Gefährdungen von Menschenleben zu verhindern.
- Selbst sichere Rust-Programme können Fehlfunktionen zeigen oder anfällig für Denial-of-Service-Angriffe sein.
- Property-Testing kann helfen, Randfälle zu finden, indem zufällige Eingaben erzeugt werden, hat aber Schwierigkeiten mit unmöglichen Fehlern.
- Kani ist ein Model Checker, der mit mathematischen Methoden die Korrektheit eines Programms innerhalb gegebener Einschränkungen überprüft.
- Vorteile von Kani: Es bewertet alle Eingaben innerhalb der Einschränkungen mathematisch. Einschränkungen: Schleifen müssen entrollt werden, und Concurrency oder C/C++-FFI werden nicht unterstützt.
- Fazit zu Rust: Rust ist sicher, aber nicht so sicher, wie man vielleicht denkt.
- Bjarne Stroustrup unterscheidet zwischen C und C++ und merkt an, dass C++ für sichereren Code entworfen wurde.
- Die C++ Core Guidelines bieten Profile für Type Safety, Bounds Safety und Lifetime Safety und nähern sich damit den Garantien von Rust an.
- Das größte Problem von C++ ist, dass es standardmäßig zu leicht ist, unsicheren Code zu schreiben. Es liegt nicht daran, dass Entwickler sich nicht bemühen.
Noch keine Kommentare.