Das LLVM-Projekt entwickelt die puffersichere Handhabung in C++

Die Entwickler des LLVM-Projekts haben eine Reihe von Änderungen vorgeschlagen, die darauf abzielen, die Sicherheit geschäftskritischer C++-Projekte zu stärken und eine Möglichkeit zur Beseitigung von Fehlern bereitzustellen, die durch Pufferüberläufe verursacht werden. Die Arbeit konzentriert sich auf zwei Bereiche: die Bereitstellung eines Entwicklungsmodells, das ein sicheres Arbeiten mit Puffern ermöglicht, und die Arbeit an der Härtung der Sicherheit der libc++-Standardfunktionsbibliothek.

Das vorgeschlagene sichere Programmiermodell für C++ besteht darin, bei der Arbeit mit Puffern die von der Standardbibliothek bereitgestellten Klassen zu verwenden, anstatt bloße Zeiger zu manipulieren. Es wird beispielsweise vorgeschlagen, die Klassen std::array, std::vector und std::span zu verwenden, die mit einer Laufzeitprüfung für außerhalb der Grenzen zugewiesenen Speicher hinzugefügt werden.

Um gefährliche Programmierpraktiken in Clang zu bekämpfen, wird vorgeschlagen, Compiler-Warnungen für alle Zeiger-Arithmetikoperationen auszugeben, ähnlich den Linter-Warnungen von Clang-Tidy bei Verwendung des Flags „cppcoreguidelines-pro-bounds-pointer-arithmetic“, dessen Unterstützung in angezeigt wird das Release LLVM 16. Um solche Warnungen zu ermöglichen, wird clang ein separates Flag hinzugefügt, das standardmäßig nicht aktiv ist.

Es ist geplant, einen optionalen gehärteten Schutzmodus in libc++ zu implementieren, der, wenn er aktiviert ist, einige Situationen abfängt, die zur Laufzeit zu undefiniertem Verhalten führen. Beispielsweise wird in den Klassen std::span und std::vector ein Zugriff außerhalb der Grenzen überwacht, wobei das Programm in diesem Fall abstürzt. Die Entwickler glauben, dass durch das Hinzufügen solcher Änderungen die Konformität von libc++ mit den C++-Standards erhalten bleibt, da die Entscheidung, wie mit Fällen undefinierten Verhaltens umgegangen wird, bei den Entwicklern der Bibliothek liegt, die unter anderem undefiniertes Verhalten als einen Absturz interpretieren können, der dies erfordert Programm zum Beenden.

Laufzeitprüfungen in libc++ sollen in Kategorien unterteilt werden, die einzeln eingebunden werden können. Einige der vorgeschlagenen Prüfungen, die nicht zu komplexeren Vorgängen oder ABI-Änderungen führen, sind bereits im abgesicherten Modus von libc++ implementiert.

Darüber hinaus ist geplant, ein Toolkit zum Korrigieren des Codes vorzubereiten, mit dem Sie Variablen durch bloße Zeiger auf Containern ersetzen und alternative Handler in Situationen anwenden können, in denen der Container den Zeiger nicht direkt ersetzen kann (z. B. „if (array_pointer)“). Das Konstrukt kann in „if (span.data ()“) konvertiert werden. Anpassungen können nicht nur auf lokale Variablen, sondern auch auf Typparameter mit Zeigern angewendet werden.

Source: opennet.ru

Kommentar hinzufügen