Die Entwickler des LLVM-Projekts haben eine Reihe von Änderungen vorgeschlagen, die darauf abzielen, die Sicherheit kritischer C++-Projekte zu erhöhen und Mittel zur Vermeidung von Fehlern bereitzustellen, die durch das Übersteigen der zulässigen Grenzen von Speichern entstehen. Die Arbeit konzentriert sich auf zwei Bereiche: die Bereitstellung eines Entwicklungsmodells, das einen sicheren Umgang mit Speichern ermöglicht, und Maßnahmen zur Verbesserung des Schutzes der Standardbibliothek libc++.
Das vorgeschlagene Modell für sicheres Programmieren in C++ sieht die Verwendung von Klassen der Standardbibliothek beim Arbeiten mit Speichern anstelle von Manipulationen mit rohen Zeigern vor. Beispielsweise wird empfohlen, die Klassen std::array, std::vector und std::span zu verwenden, in die zur Laufzeit eine Überprüfung auf Überschreitung des zugewiesenen Speichers eingebaut wird.
Um gefährliche Programmierpraktiken in clang zu bekämpfen, wird vorgeschlagen, Compiler-Warnungen für alle arithmetischen Operationen mit Zeigern auszugeben, ähnlich den Warnungen von clang-tidy, die unter Verwendung des Flags „cppcoreguidelines-pro-bounds-pointer-arithmetic“ ausgegeben werden, dessen Unterstützung in der LLVM 16-Version verfügbar sein wird. Um solche Warnungen in clang zu aktivieren, wird ein separater, standardmäßig deaktivierter Flag hinzugefügt.
In libc++ ist geplant, einen optionalen Modus mit verstärktem Schutz zu implementieren, der bestimmte Situationen zur Laufzeit erfasst, die zu undefiniertem Verhalten führen. Beispielsweise wird in den Klassen std::span und std::vector der Zugriff über den zugewiesenen Speicherbereich überwacht, und bei einer Feststellung wird das Programm mit einem Fehler beendet. Die Entwickler sind der Meinung, dass die Hinzufügung solcher Änderungen die Übereinstimmung von libc++ mit den C++-Standards gewährleistet, da die Wahl der Handhabung von Situationen mit undefiniertem Verhalten den Entwicklern der Bibliothek obliegt, die diese auch als Fehler interpretieren können, die eine Beendigung des Programms erfordern.
Die zur Laufzeit durchgeführten Überprüfungen in libc++ sollen in Kategorien unterteilt werden, die einzeln aktiviert werden können. Einige der vorgeschlagenen Überprüfungen, die keine komplexen Operationen oder Änderungen der ABI verursachen, sind bereits im Rahmen des sicheren Modus von libc++ (safe mode) implementiert.
Zusätzlich ist geplant, ein Werkzeug zur Codekorrektur vorzubereiten, das es ermöglicht, Variablen mit nackten Zeigern durch Container zu ersetzen und alternative Handler in Situationen anzuwenden, in denen ein Container einen Zeiger nicht direkt ersetzen kann (zum Beispiel kann die Konstruktion „if(array_pointer)“ in „if(span.data()“ umgewandelt werden). Korrekturen können nicht nur auf lokale Variablen, sondern auch auf Parameter von Typen mit Zeigern angewendet werden.
Quelle: opennet.ru
