Das LLVM-Projekt entwickelt Werkzeuge für den sicheren Umgang mit Puffern in C++

Die Entwickler des LLVM-Projekts haben eine Reihe von Änderungen vorgeschlagen, die darauf abzielen, die Sicherheit von sicherheitskritischen Projekten in C++ zu erhöhen und Mittel bereitzustellen, um Fehler, die durch das Überschreiten von Puffergrenzen verursacht werden, zu vermeiden. Die Arbeiten konzentrieren sich auf zwei Bereiche: die Bereitstellung eines Entwicklungsmodells, das einen sicheren Umgang mit Puffern ermöglicht, sowie die Verbesserung des Schutzes der Standardfunktionalitätsbibliothek libc++.

Das vorgeschlagene Modell für sicheres Programmieren in C++ sieht vor, dass bei der Arbeit mit Puffern die von der Standardbibliothek bereitgestellten Klassen anstelle von Rohzeigern verwendet werden. Beispielsweise wird empfohlen, die Klassen std::array, std::vector und std::span zu verwenden, die zur Laufzeit eine Überprüfung auf das Überschreiten der zugewiesenen Speicherkapazität hinzufügen werden.

Um gefährlichen Programmierpraktiken in Clang entgegenzuwirken, wird vorgeschlagen, Compiler-Warnungen für alle arithmetischen Operationen mit Zeigern auszugeben, ähnlich den Warnungen des Linters Clang-Tidy, die bei Verwendung des Flags „cppcoreguidelines-pro-bounds-pointer-arithmetic“ ausgegeben werden. Die Unterstützung hierfür wird in der Veröffentlichung von LLVM 16 verfügbar sein. Um solche Warnungen in Clang zu aktivieren, wird ein separater Flag hinzugefügt, der standardmäßig nicht aktiviert ist.

In libc++ wird ein optionaler Modus für verbesserte Sicherheit geplant, bei dem während der Ausführung bestimmte Situationen erfasst werden, die zu undefiniertem Verhalten führen können. Beispielsweise wird in den Klassen std::span und std::vector der Zugriff außerhalb des zugewiesenen Speicherbereichs überwacht. Wenn dieser erkannt wird, wird die Anwendung beendet. Die Entwickler sind der Meinung, dass solche Änderungen die Konformität von libc++ mit den C++-Standards wahren, da die Wahl der Handhabung von undefiniertem Verhalten bei den Bibliotheksentwicklern liegt, die dies unter anderem als einen Fehler interpretieren können, der die Beendigung des Programms erfordert.

Während der Überprüfung in libc++ geplante Tests werden in Kategorien unterteilt, die einzeln aktiviert werden können. Einige der vorgeschlagenen Prüfungen, die keine Komplikationen oder Veränderungen der ABI verursachen, sind bereits im Rahmen des sicheren Modus von libc++ implementiert.

Zusätzlich wird ein Toolset zur Anpassung des Codes vorbereitet, das es ermöglicht, Variablen mit rohen Zeigern durch Container zu ersetzen und alternative Handler in Situationen anzuwenden, in denen ein Container nicht direkt einen Zeiger ersetzen kann (zum Beispiel kann die Konstruktion "if(array_pointer)" in "if(span.data())" umgewandelt werden). Anpassungen können nicht nur auf lokale Variablen, sondern auch auf Typparameter mit Zeigern angewendet werden.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster