Programeri projekta LLVM predložili su niz promjena usmjerenih na poboljšanje sigurnosti kritičnih projekata na jeziku C++ i pružanje alata za izbjegavanje grešaka uzrokovanih izlaskom iz dopuštenih granica bafera. Rad se fokusira na dva područja: pružanje modela razvoja koji omogućuje siguran rad s baferima i rad na poboljšanju zaštite standardne biblioteke funkcija libc++.
Predloženi model sigurnog programiranja za C++ predviđa korištenje klasa koje pruža standardna biblioteka prilikom rada s baferima umjesto manipulacije golim pokazivačima. Na primjer, predlaže se korištenje klasa std::array, std::vector i std::span, u koje će biti dodana provjera izlaska iz granica dodijeljene memorije koja se provodi tijekom izvođenja.
Za suzbijanje opasnih tehnika programiranja, clang predlaže ispisivanje upozorenja kompajlera za sve aritmetičke operacije s pokazivačima, sličnih upozorenjima lint-a clang-tidy, koja se ispisuju prilikom korištenja flag-a «cppcoreguidelines-pro-bounds-pointer-arithmetic», a podrška bi trebala biti uključena u izdanju LLVM 16. Za uključivanje sličnih upozorenja u clang bit će dodana zasebna zastavica koja nije aktivna po defaultu.
U libc++ planira se implementirati opcionalni način pojačane zaštite, pri čemu će tijekom izvođenja biti praćene određene situacije koje dovode do neodređenog ponašanja. Na primjer, u klasama std::span i std::vector bit će praćeno pristupanje izvan dodijeljenog područja memorije, u slučaju otkrivanja čega će program biti nesnažno prekinut. Programeri smatraju da će dodavanje takvih promjena očuvati usklađenost libc++ sa standardima C++, budući da izbor metode obrade slučajeva neodređenog ponašanja leži na programerima biblioteke, koji to mogu tumačiti kao kvar koji zahtijeva prekid rada programa.
Planira se kategorizacija provedenih provjera u libc++, koje će se moći uključivati pojedinačno. Neki od predloženih provjera, koje ne kompliciraju operacije ili ne mijenjaju ABI, već su implementirani u okviru sigurnog načina rada libc++ (safe mode).
Osim toga, planira se priprema alata za prilagodbu koda, koji omogućava zamjenu varijabli s običnim pokazivačima s kontejnerima i primjenu alternativnih rukovatelja u situacijama kada kontejner ne može izravno zamijeniti pokazivač (na primjer, konstrukcija 'if(array_pointer)' može se pretvoriti u 'if(span.data()'). Prilagodbe se mogu primijeniti ne samo na lokalne varijable, već i na parametre tipova s pokazivačima.
Izvor: opennet.ru
