Projekt LLVM vyvíjí bezpečné zacházení s vyrovnávací pamětí v C++

Vývojáři projektu LLVM navrhli řadu změn zaměřených na posílení bezpečnosti kritických C++ projektů a poskytnutí prostředků k odstranění chyb způsobených přetečením vyrovnávací paměti. Práce je zaměřena na dvě oblasti: poskytnutí vývojového modelu, který vám umožní bezpečně pracovat s vyrovnávacími pamětmi, a práci na posílení zabezpečení standardní knihovny funkcí libc++.

Navrhovaný model bezpečného programování pro C++ spočívá v použití tříd poskytovaných standardní knihovnou při práci s vyrovnávacími pamětmi namísto manipulace s holými ukazateli. Navrhuje se například použití tříd std::array, std::vector a std::span, které budou přidány s kontrolou za běhu pro alokovanou paměť mimo meze.

Pro boj s nebezpečnými programovacími praktikami v clang se navrhuje vydávat varování kompilátoru pro všechny aritmetické operace ukazatelů, podobně jako u clang-tidy's linter varování při použití příznaku „cppcoreguidelines-pro-bounds-pointer-arithmetic“, jehož podpora se objeví v vydání LLVM 16. Pro povolení takových varování bude k clangu přidán samostatný příznak, který není ve výchozím nastavení aktivní.

Plánuje se implementace volitelného režimu zesílené ochrany v libc++, který, když je povolen, zachytí některé situace, které vedou k nedefinovanému chování za běhu. Například ve třídách std::span a std::vector bude monitorován přístup mimo hranice a v takovém případě dojde k selhání programu. Vývojáři věří, že přidání takových změn udrží libc++ v souladu se standardy C++, protože rozhodnutí, jak zacházet s případy nedefinovaného chování, spočívá na vývojářích knihovny, kteří mohou mimo jiné interpretovat nedefinované chování jako pád, který vyžaduje program pro ukončení.

Kontroly běhu v libc++ jsou plánovány tak, aby byly rozděleny do kategorií, které lze zahrnout jednotlivě. Některé z navrhovaných kontrol, které nevedou ke složitějším operacím nebo změnám ABI, jsou již implementovány v nouzovém režimu libc++.

Kromě toho se plánuje připravit sadu nástrojů pro opravu kódu, která vám umožní nahradit proměnné holými ukazateli na kontejnerech a použít alternativní ovladače v situacích, kdy kontejner nemůže přímo nahradit ukazatel (například „if (array_pointer)“ konstrukt lze převést na „if (span.data ()“). Úpravy lze aplikovat nejen na lokální proměnné, ale také na parametry typu s ukazateli.

Zdroj: opennet.ru

Přidat komentář