Vývojári projektu LLVM navrhli množstvo zmien zameraných na zlepšenie bezpečnosti kritických projektov v jazyku C++ a poskytnutie prostriedkov na vylúčenie chýb spôsobených prekročením povolených hraníc buffera. Práca sa zameriava na dva smery: poskytovanie modelu vývoja, ktorý umožňuje bezpečne pracovať s buffermi, a posilnenie ochrany štandardnej knižnice funkcií libc++.
Navrhovaný model bezpečného programovania pre C++ predpokladá využívanie tried poskytovaných štandardnou knižnicou pri práci s buffermi namiesto manipulácie s holými ukazovateľmi. Napríklad sa navrhuje používať triedy std::array, std::vector a std::span, do ktorých bude pridaná kontrola prekročenia hraníc pridelené pamäte vykonávaná počas behu programu.
Na boj proti nebezpečným programovacím praktikám v clang sa navrhuje vypisovať varovania kompilátora pre všetky aritmetické operácie s ukazovateľmi, podobné varovaniam lintera clang-tidy, ktoré sa zobrazujú pri použití prepínača „cppcoreguidelines-pro-bounds-pointer-arithmetic“, podpora ktorého sa objaví vo vydaní LLVM 16. Pre aktiváciu takýchto varovaní bude do clang pridaný samostatný prepínač, ktorý nebude predvolene aktívny.
V libc++ sa plánuje implementovať voliteľný režim zvýšenej ochrany, ktorý pri aktivácii zachytáva niektoré situácie vedúce k nepredvídateľnému správaniu. Napríklad v triedach std::span a std::vector sa bude sledovať prístup za hranice prideleného priestoru pamäte, pričom v prípade zistenia tohto prístupu bude program nútene ukončený. Vývojári veria, že pridanie takýchto zmien udrží libc++ v súlade so štandardmi C++, pretože rozhodovanie o spôsobe spracovania situácií nepredvídateľného správania je na vývojároch knižnice, ktorí môžu predpokladať nepredvídateľné správanie ako chybu, ktorá vyžaduje ukončenie programu.
Kontroly vykonávané v libc++ plánujú byť rozdelené do kategórií, ktoré sa dajú zapnúť individuálne. Niektoré z navrhovaných kontrol, ktoré nezvyšujú zložitosti operácií alebo nemenia ABI, už boli implementované v rámci bezpečného režimu libc++ (safe mode).
Navyše sa plánuje vytvoriť nástroj na úpravu kódu, ktorý umožňuje nahrádzať premenné s holými ukazovateľmi kontajnermi a aplikovať alternatívne spracovateľov v situáciách, keď kontajner nemôže priamo nahradiť ukazovateľ (napríklad konštrukcia „if(array_pointer)“ môže byť premenená na „if(span.data())“). Úpravy sa môžu vzťahovať nielen na lokálne premenné, ale aj na parametre typov s ukazovateľmi.
Zdroj: opennet.ru
