LLVM projekt arendab puhverohutu käitlemist C++ keeles

LLVM-i projekti arendajad on pakkunud välja mitmeid muudatusi, mille eesmärk on tugevdada missioonikriitiliste C++ projektide turvalisust ja pakkuda vahendeid puhvri ülekoormusest põhjustatud vigade kõrvaldamiseks. Töö on keskendunud kahele valdkonnale: arendusmudeli pakkumine, mis võimaldab turvaliselt puhvritega töötada, ja libc++ standardse funktsioonide teegi turvalisuse tugevdamine.

Kavandatav ohutu programmeerimismudel C++ jaoks on kasutada puhvritega töötamisel standardse teegi pakutavaid klasse, selle asemel et paljaste osutitega manipuleerida. Näiteks soovitatakse kasutada klasse std::massiivi, std::vector ja std::span, mis lisatakse piiride välise eraldatud mälu käitusaja kontrolliga.

Ohtlike programmeerimistavade vastu võitlemiseks on tehtud ettepanek anda kompilaatorite hoiatused kõigi kursori aritmeetiliste toimingute jaoks, mis on sarnased clang-tidy linterihoiatustega lipu "cppcoreguidelines-pro-bounds-pointer-aritmetic" kasutamisel, mille tugi ilmub väljalase LLVM 16. Selliste hoiatuste lubamiseks lisatakse klangile eraldi lipp, mis vaikimisi ei ole aktiivne.

Libc++-s on plaanis juurutada valikuline tugevdatud kaitserežiim, mis lubamisel tabab mõningaid olukordi, mis viivad käitusajal määratlemata käitumiseni. Näiteks std::span ja std::vector klassides jälgitakse piirivälist juurdepääsu, mille puhul programm jookseb kokku. Arendajad usuvad, et selliste muudatuste lisamine hoiab libc++ ühilduvana C++ standarditega, kuna määratlemata käitumise juhtumite käsitlemise valik on teegi arendajatel, kes võivad muu hulgas tõlgendada määratlemata käitumist krahhina, mis nõuab programm väljumiseks.

Libc++ käitusaegsed kontrollid on kavas jagada kategooriatesse, mida saab eraldi kaasata. Mõned soovitatud kontrollid, mis ei too kaasa keerulisemaid toiminguid ega ABI muudatusi, on juba rakendatud libc++ turvarežiimis.

Lisaks on kavas koostada koodi parandamise tööriistakomplekt, mis võimaldab konteinerites muutujaid asendada paljaste osutitega ja rakendada alternatiivseid käsitsejaid olukordades, kus konteiner ei saa osutit otse asendada (näiteks “if (massiivi_pointer)” konstruktsiooni saab teisendada "if (span.data ()"). Kohandusi saab rakendada mitte ainult kohalikele muutujatele, vaid ka osutitega tüübiparameetritele.

Allikas: opennet.ru

Lisa kommentaar