Projekt LLVM vyvíjí nástroje pro bezpečnou práci s buffery v C++.

Vývojáři projektu LLVM navrhli řadu změn, které mají za cíl posílit bezpečnost kritických projektů v jazyce C++ a poskytnout prostředky pro odstranění chyb způsobených překročením povolených limitů bufferů. Práce je zaměřena na dvě oblasti: poskytování vývojového modelu, který umožňuje bezpečnou práci s buffery, a posílení ochrany standardní knihovny funkcí libc++.

Navrhovaný model bezpečného programování pro C++ předpokládá použití tříd poskytovaných standardní knihovnou při práci s buffery místo manipulace s holými ukazateli. Například se navrhuje používat třídy std::array, std::vector a std::span, do kterých bude přidána kontrola překročení hranic přidělené paměti prováděná za běhu.

Pro boj s nebezpečnými programovacími praktikami se v clang navrhuje zobrazovat varování kompilátoru pro všechny aritmetické operace s ukazateli, podobně jako varování linteru clang-tidy, která se zobrazují při použití příznaku „cppcoreguidelines-pro-bounds-pointer-arithmetic“, jehož podpora se objeví ve verziji LLVM 16. Pro aktivaci podobných varování bude do clang přidán samostatný příznak, který nebude ve výchozím stavu aktivní.

V libc++ je plánována realizace volitelného režimu posílené ochrany, při jehož zapnutí budou během běhu zachycovány některé situace vedoucí k nejednoznačnému chování. Například v třídách std::span a std::vector bude sledováno přístupování za hranice přidělené oblasti paměti, což při zjištění povede k havárii programu. Vývojáři se domnívají, že přidání takových změn udrží libc++ v souladu se standardy C++, protože volba metody zpracování případů nejednoznačného chování leží na vývojářích knihovny, kteří mohou nejednoznačné chování interpretovat jako selhání, které vyžaduje ukončení programu.

Kontroly prováděné za běhu v libc++ plánují rozdělit do kategorií, které budou možné zapínat samostatně. Některé z navrhovaných kontrol, které nevedou ke zkroucení operací nebo změně ABI, již byly realizovány v rámci bezpečného režimu libc++ (safe mode).

Dále se plánuje vyvinout nástroje pro úpravu kódu, které umožní nahrazovat proměnné s holými ukazateli kontejnery a používat alternativní zpracovatele v situacích, kdy kontejner nemůže přímo nahradit ukazatel (například konstrukce „if(array_pointer)“ může být převedena na „if(span.data()“). Úpravy se mohou vztahovat nejen na místní proměnné, ale i na parametry typů s ukazateli.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster