Blog 3 Min. Lesezeit

Welche Versuche gab es, Speichersicherheit in C++ zu bringen?

Diesen Artikel teilen
What attempts have been made to bring memory safety to C++?

C++ ist eine leistungsfähige und weit verbreitete Programmiersprache, die für ihre Flexibilität und Performance bekannt ist. Einer ihrer historischen Nachteile ist jedoch das Fehlen integrierter Mechanismen für Speichersicherheit. Dadurch können unterschiedliche speicherbezogene Fehler wie Buffer Overflows, Dangling Pointer und Memory Leaks entstehen.

Dieses Problem ist seit Jahrzehnten bekannt, und es gab zahlreiche Versuche, es zu lösen. Leider hat bislang keiner davon eine vollständige Lösung hervorgebracht.

Was wurde im Laufe der Jahre unternommen, um die Speichersicherheit der Sprache zu verbessern?

Garbage Collector

Ein Garbage Collector (GC) ist ein Mechanismus in Programmiersprachen und Laufzeitumgebungen, der vom Programm nicht mehr benötigten Speicher automatisch freigibt. Seine Hauptaufgabe besteht darin, Speicherzuweisung und -freigabe zu verwalten. Dadurch werden Entwickler von manueller Speicherverwaltung entlastet und typische speicherbezogene Fehler wie Memory Leaks und Dangling Pointer vermieden.

Für C++ wurde 2008 eine minimale Unterstützung für Garbage Collection und erreichbarkeitsbasierte Leak-Erkennung in C++0x aufgenommen. Seitdem wurden zahlreiche Vorschläge eingebracht. Leider deckte keiner davon alle Fälle ab, und mit C++23 wurde die Garbage-Collector-Unterstützung endgültig entfernt.

Borrow Checker

Der Borrow Checker ist eine zentrale Funktion der Programmiersprache Rust. Er erzwingt Speichersicherheit und verhindert Data Races, indem Ownership und das Ausleihen von Referenzen bereits zur Compile-Zeit statisch analysiert werden. Er zählt zu den wichtigsten Innovationen von Rust und ist ein grundlegender Bestandteil seines Ownership-Modells.

Damit stellt sich die Frage: Warum diesen Mechanismus nicht auch in C++ einführen?

2021 versuchte ein Team von Google Chromium, diese Frage zu beantworten. In seinem Abschlussbericht, kam es zu folgendem Schluss:

Auf den ersten Blick könnte es so aussehen, als hätten wir mit den oben definierten Typen erfolgreich Borrow Checking für C++ implementiert. Leider ist das nicht der Fall.

Wie im Bericht beschrieben, blieben zahlreiche Herausforderungen ungelöst, sodass Borrow Checking letztlich nicht in C++ integriert werden konnte.

Laufzeitprüfungen

C++-Laufzeitprüfungen umfassen verschiedene Mechanismen und Techniken, mit denen sich das Programmverhalten validieren und Fehler während der Ausführung erkennen lassen. In C++ werden dafür sogenannte Sanitizer eingesetzt. Sie sind Bestandteil der Compiler Clang und GCC und instrumentieren Programme zur Laufzeit, um Fehler während der Ausführung aufzuspüren. Sanitizer werden üblicherweise in Entwicklungs- und Testphasen eingesetzt, um Probleme zu identifizieren und zu beheben. In Produktionsumgebungen kommen sie dagegen meist nicht zum Einsatz, sodass manche dort auftretenden Fehler während der Entwicklung unentdeckt bleiben können.

Selbst während der Entwicklung werden Sanitizer nicht überall eingesetzt und kommen daher keineswegs immer zum Einsatz.

Wie geht es weiter?

Derzeit arbeitet Stroustrup an einer möglichen Lösung für dieses Sicherheitsproblem: den sogenannten C++ Profiles. Dabei handelt es sich um Regelwerke, deren Einhaltung bestimmte Sicherheitsgarantien ermöglichen soll. Sie sollen durch den ISO-C++-Standard definiert werden und häufige Sicherheitsprobleme etwa bei Zeigern und Array-Grenzen adressieren.

Er hat ein GitHub-Repositoryeingerichtet, in dem Interessierte Vorschläge einreichen können und er seine Entwürfe teilen kann. So soll eine Community entstehen, die diese Arbeit in einem angemessenen Zeitrahmen voranbringt.

Fazit

C++ hat sich bislang allen Versuchen widersetzt, umfassende Speichersicherheit in die Sprache zu integrieren. Eine endgültige Lösung für dieses bedeutende Problem wird jedoch immer dringlicher. Vielleicht sollten wir darüber nachdenken, es in die Liste der Millennium-Probleme aufzunehmen. :)

Diesen Artikel teilen