Twórcy projektu LLVM zaproponowali szereg zmian mających na celu zwiększenie bezpieczeństwa krytycznych projektów w języku C++ oraz dostarczenie narzędzi do eliminacji błędów związanych z przekroczeniem dozwolonych granic buforów. Prace koncentrują się na dwóch kierunkach: dostarczenie modelu rozwoju, który umożliwia bezpieczną pracę z buforami oraz prace nad wzmocnieniem ochrony standardowej biblioteki funkcji libc++.
Proponowany model bezpiecznego programowania w C++ zakłada korzystanie z klas udostępnianych przez standardową bibliotekę podczas pracy z buforami zamiast manipulacji nagimi wskaźnikami. Na przykład, proponuje się wykorzystanie klas std::array, std::vector i std::span, do których zostanie dodana weryfikacja przekroczenia granic przydzielonej pamięci, przeprowadzana w czasie wykonywania.
Aby przeciwdziałać niebezpiecznym praktykom programistycznym, w clang planowane jest generowanie ostrzeżeń kompilatora dla wszystkich operacji arytmetycznych z wskaźnikami, podobnych do ostrzeżeń lintera clang-tidy, generowanych przy użyciu flagi „cppcoreguidelines-pro-bounds-pointer-arithmetic”, której wsparcie pojawi się w wersji LLVM 16. Aby włączyć takie ostrzeżenia w clang, zostanie dodana osobna flaga, nieaktywna domyślnie.
W libc++ planowane jest wdrożenie opcjonalnego trybu wzmocnionej ochrony, który, po aktywowaniu, będzie wychwytywał niektóre sytuacje prowadzące do nieokreślonego zachowania w czasie wykonywania. Na przykład, w klasach std::span i std::vector będzie monitorowane dostęp do pamięci poza przydzielonym obszarem; w przypadku wykrycia takiego dostępu, program zostanie awaryjnie zakończony. Twórcy wierzą, że dodanie takich zmian utrzyma libc++ w zgodności z standardami C++, ponieważ wybór metody obsługi przypadków nieokreślonego zachowania spoczywa na twórcach biblioteki, którzy mogą traktować nieokreślone zachowanie jako błąd, wymagający zakończenia działania programu.
Testy przeprowadzane podczas wykonywania w libc++ mają być kategoryzowane, co umożliwi ich włączanie osobno. Niektóre z proponowanych kontrol, które nie prowadzą do skomplikowania operacji ani zmiany ABI, zostały już zrealizowane w ramach trybu bezpiecznego libc++ (safe mode).
Dodatkowo planowane jest przygotowanie narzędzi do korekty kodu, umożliwiających zastępowanie zmiennych z surowymi wskaźnikami na kontenery oraz stosowanie alternatywnych obsługiwaczy w sytuacjach, gdy kontener nie może bezpośrednio zastąpić wskaźnika (na przykład konstrukcja "if(array_pointer)" może być przekształcona w "if(span.data())"). Korekty mogą być stosowane nie tylko do zmiennych lokalnych, ale także do parametrów typów z wskaźnikami.
Źródło: opennet.ru
