C++ 2 min read

Warum ist Speichersicherheit so schwer in C++ zu integrieren?

Share this article
Why is memory safety so hard to add to the C++ language?

Speichersicherheit in C++ zu integrieren ist aufgrund der grundlegenden Designprinzipien der Sprache und ihrer langen Geschichte eine große Herausforderung. Dies sind die wichtigsten Gründe, warum sich Speichersicherheit in C++ besonders schwer umsetzen lässt:

Performance vs. Safety Trade-offs

  • C++ ist darauf ausgelegt, maximale Performance und eine sehr feine Kontrolle über Systemressourcen einschließlich des Speichers zu bieten. Sicherheitsfunktionen erfordern häufig Laufzeitprüfungen, die zusätzlichen Performance-Aufwand verursachen können. Das steht im Spannungsfeld zum C++-Prinzip der „Zero-Cost Abstractions“, nach dem Funktionen keinen zusätzlichen Aufwand verursachen sollen, solange sie nicht ausdrücklich genutzt werden.

Backwards Compatibility

  • Über Jahrzehnte ist eine enorme Menge an C++-Code entstanden. Sicherzustellen, dass neue Sicherheitsfunktionen bestehenden Code nicht beschädigen, ist eine erhebliche Herausforderung. Die Sprachentwickler müssen gewährleisten, dass zusätzliche Speichersicherheit keine Legacy-Systeme beeinträchtigt, die stark vom heutigen Verhalten von C++ abhängen.

Manual Memory Management

  • Eines der prägenden Merkmale von C++ ist die manuelle Speicherverwaltung mit Zeigern, new / delete und benutzerdefinierten Allokatoren. Speichersicherheitsfunktionen wie Garbage Collection oder eine automatisierte Speicherverwaltung würden erhebliche Änderungen an der Art erfordern, wie C++-Programme geschrieben werden, und könnten etablierte Vorgehensweisen grundlegend verändern.

Complexity of the Language

  • C++ ist eine komplexe Sprache, deren zahlreiche Funktionen auf vielfältige Weise miteinander interagieren. Speichersicherheitsmechanismen hinzuzufügen, die mit all diesen Funktionen – etwa RAII (Resource Acquisition Is Initialization), Template-Metaprogrammierung und Low-Level-Systemprogrammierung – konsistent funktionieren, erhöht sowohl die Komplexität des Sprachdesigns als auch die der Implementierung.

Diverse Use Cases

  • C++ wird in sehr unterschiedlichen Bereichen eingesetzt, vom High-Performance Computing über eingebettete Systeme bis hin zu Echtzeitanwendungen. Jeder Bereich hat eigene Anforderungen und Einschränkungen. Funktionen zur Speichersicherheit, die für einen Bereich geeignet sind, können in einem anderen inakzeptabel sein. Eine universelle Lösung ist daher nur schwer zu realisieren.

Aufgrund dieser Herausforderungen geht das C++-Standardisierungskomitee vorsichtig vor. Sicherheitsfunktionen sollen schrittweise eingeführt werden, beispielsweise über optionale Werkzeuge oder Bibliotheken, statt sie auf Sprachebene zwingend vorzuschreiben. So können Entwickler sicherere Verfahren gezielt einsetzen, ohne die Flexibilität und Performance aufzugeben, für die C++ bekannt ist.

Erfreulicherweise rückt das C++-Standardisierungskomitee (WG21) die Speichersicherheit zunehmend in den Mittelpunkt. Es gibt Bestrebungen, Sicherheitsprüfungen zur Compile-Zeit zu integrieren, ohne die Performance zu beeinträchtigen. Dadurch könnte C++ standardmäßig sicherer werden und langjährige Probleme rund um die Speicherverwaltung besser adressieren.

In diesem interessanten Vortrag geht Herb Sutter ausführlicher auf die Sicherheit von C++ ein.

https://youtu.be/EB7yR-1317k?si=K5XnWn7ifYxSLeqf

Um ein konkreteres Bild von der Zukunft von C++ im Hinblick auf Speichersicherheit zu erhalten, können Sie an Herb Sutters Online-Konferenz teilnehmen, die von MeetingCpp organisiert wird.

Share this article