LLVM projekti arendajad on teinud mitmeid muudatusi, et tugevdada C++-keeles kriitiliste projektide turvalisust ning pakkuda vahendeid, mis aitavad vĂ€ltida vigu, mis on pĂ”hjustatud mĂ€lupiiride ĂŒletamisest. Töö keskendub kahele suunale: arendamismudeli pakkumine, mis vĂ”imaldab turvaliselt töötada mĂ€lude kallal, ja standardsete libc++ funktsioonide teegi kaitse tugevdamise tööde lĂ€biviimine.
Pakutud turvalise programmeerimise mudel C++-le eeldab, et mĂ€ludega töötamisel kasutatakse standardteegi klasside vĂ”imalusi, mitte tooredate nĂ€idikute manustamist. NĂ€iteks soovitatakse kasutada klasse std::array, std::vector ja std::span, millele lisatakse mĂ€lupiiride ĂŒletamise kontroll, mis toimub jooksvalt.
Clang'is soovitatakse ohtlike programmeerimisvĂ”tete vastu, et pidevalt kompileerimise ajal nĂ€idata hoiatusi kĂ”ikide pointerite matemaatiliste operatsioonide puhul, mis sarnanevad clang-tidy linter'i vĂ€ljastatud hoiatusetele, kasutades lippu âcppcoreguidelines-pro-bounds-pointer-arithmeticâ, mille tugi lisandub LLVM 16 versioonis. Sarnaste hoiatuste lubamiseks lisatakse clang'ile eraldi lipp, mis ei ole vaikimisi aktiivne.
Libc++ plaanib rakendada valikulist tugevdatud kaitse reĆŸiimi, mille aktiveerimisel tuvastatakse kĂ€itusaja jooksul teatud olukorrad, mis vĂ”ivad viia mÀÀramatute kĂ€itumiseni. NĂ€iteks klassides std::span ja std::vector jĂ€lgitakse mĂ€lupiiridest vĂ€lja pÀÀsemist ning sellise juhtumi tuvastamisel lĂ”petatakse programm ÀÀrmuslikult. Arendajad usuvad, et selliste muudatuste lisamine sĂ€ilitab libc++ vastavuse C++ standarditele, kuna mÀÀramatute olukordade kĂ€sitlemise meetodi valik jÀÀb teegiarendajate otsustada, kes vĂ”ivad sealhulgas tĂ”lgendada mÀÀramatut kĂ€itumist kui viga, mis nĂ”uab programmi lĂ”petamist.
LĂ€biviidud kontrollid libc++ raames plaanivad jagada kategooriatesse, mida saab eraldi sisse lĂŒlitada. MĂ”ned pakutavad kontrollid, mis ei too kaasa operatsioonide keerulisemaks muutmist ega ABI muutmist, on juba rakendatud libc++ turvareĆŸiimi (safe mode) raames.
Lisaks plaanitakse vĂ€lja töötada tööriistakomplekt koodi kohandamiseks, mis vĂ”imaldab asendada muutujaid palja nĂ€idikutega konteineritega ning rakendada alternatiivseid töötlejaid olukordades, kus konteiner ei saa otse nĂ€idikut asendada (nĂ€iteks konstruktsioon «if(array_pointer)» vĂ”ib olla muudetud kujule «if(span.data()»). Kohandamisi saab rakendada mitte ainult kohalikule muutujatele, vaid ka nĂ€idikute tĂŒĂŒpi parameetritele.
Allikas: opennet.ru
