Deweloperzy LLVM proponują bezpieczną obsługę buforów w C++

Logo LLVM

LLVM to framework do tworzenia kompilatorów, a także pomagający budować nowe języki programowania i ulepszać istniejące języki.

L twórcy projektu LLVM zaproponowali szereg zmian mających na celu wzmocnienie bezpieczeństwa projektów C + + krytyczne dla misji i zapewniają środki do eliminowania błędów spowodowanych przepełnieniem bufora.

W związku z tym, opublikowana przez nich propozycja skupia się na pracy w szczególności w dwóch obszarach: dostarczaniu modelu programistycznego, który umożliwia bezpieczną pracę z buforami oraz pracy nad wzmocnieniem bezpieczeństwa standardowej biblioteki funkcji libc++.

Wspomniano, że proponowany bezpieczny model programowania dla C++ «jest używanie klas dostarczonych przez standardową bibliotekę podczas pracy z buforami zamiast manipulowania surowymi wskaźnikami». Proponuje się na przykład użycie klas std::array, std::vector i std::span, które zostaną dodane wraz ze sprawdzeniem w czasie wykonywania, czy pamięć przydzielona jest poza granicami.

Naszym celem jest poprawa bezpieczeństwa krytycznych baz kodu C++. W tym celu planujemy pracować nad dwoma pomysłami.

Wzmocniona biblioteka standardowa C++
Model programowania bezpiecznego bufora C++ i narzędzia adaptacyjne
Hardened libc++ ma na celu ogólne zwiększenie bezpieczeństwa interfejsów bibliotek standardowych C++.

Bezpieczny model programowania bufora C++ wraz z utwardzoną biblioteką libc++ zapewnia łagodzenie w czasie wykonywania dostępu do pamięci poza granicami. Narzędzia adaptacyjne zautomatyzują migrację kodu do tego nowego modelu programowania.

Oprócz tego wspomina również, że zwalczać „niebezpieczne” praktyki programistyczne w klangu, jeśli proponuje wydawanie ostrzeżeń kompilatora dla wszystkich operacji arytmetycznych wskaźników, podobnie do ostrzeżeń linter clang-tidy podczas korzystania z flagi "cppcoreguidelines-pro-bounds-pointer-arithmetic", dla której wsparcie pojawi się w LLVM 16. Aby włączyć takie ostrzeżenia, do clang zostanie dodana osobna flaga, domyślnie nieaktywna .

Planowane jest zaimplementowanie opcjonalnego trybu ochrony w libc++, które po włączeniu wykryją pewne sytuacje, które prowadzą do niezdefiniowanego zachowania w czasie wykonywania. Na przykład na zajęciach std::span i std::vector, dostęp poza granicami będzie monitorowany, w którym to przypadku program zakończy się niepowodzeniem.

Te dodatkowe testy środowiska wykonawczego zostaną pogrupowane w kilka kategorii, które można kontrolować oddzielnie. Intencją jest, aby dostawca dostarczający libc++ na swojej platformie mógł zdecydować, które sprawdzenia włączyć w bibliotece wysyłkowej (jeśli w ogóle), w zależności od pożądanego poziomu bezpieczeństwa.

Deweloperzy uważają, że dodanie takich zmian pozwoli zachować zgodność libc++ ze standardami C++, ponieważ wybór sposobu obsługi przypadków niezdefiniowanego zachowania należy do twórców bibliotek, którzy mogą między innymi traktować niezdefiniowane zachowanie jako blokadę wymagającą od programu Wyjście.

Te testy uruchomieniowe w libc++ mają być podzielone na kategorie które mogą być uwzględnione indywidualnie. Niektóre z sugerowanych sprawdzeń, które nie skutkują bardziej złożonymi operacjami lub zmianami ABI, są już zaimplementowane w trybie bezpiecznym libc++ (trybie bezpiecznym).

Powtarzając, ostatecznym celem jest, aby dostarczana biblioteka umożliwiała te sprawdzenia w produkcji; nie jest to funkcja "tylko debugowanie", chociaż ostatecznie zastąpi długo niedziałający "tryb debugowania".

Ponadto, planowane jest przygotowanie zestawu narzędzi do korekcji kodu co pozwoli na zastępowanie zmiennych surowymi wskaźnikami w kontenerach i zastosowanie alternatywnych procedur obsługi w sytuacjach, gdy kontener nie może bezpośrednio zastąpić wskaźnika (na przykład konstrukcja „if(array_pointer)” może zostać przekonwertowana na „if(span.data ( )»). Ustawienia można zastosować nie tylko do zmiennych lokalnych, ale także do parametrów typu ze wskaźnikami.

Wspomniano również, że rozważają "sprawdzanie statycznego analizatora klangu" trasa wrażliwa, która ostrzega, jeśli std::rozpiętość jest skonstruowany z kontenera, który jest mniejszy niż rozmiar określony w konstruktorze zakresu. Wspomniany kontroler jest samowystarczalny i użyteczny sam, jeśli wszystko pójdzie dobrze, zostanie domyślnie włączony dla wszystkich użytkowników

W końcu jeśli chcesz dowiedzieć się więcej na ten temat, możesz sprawdzić szczegóły w następujący link.


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: AB Internet Networks 2008 SL
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.