LLVM projekti arendajad on ette pannud mitmeid muudatusi, mille eesmĂ€rk on suurendada C++ keeles kriitiliste projektide turvalisust ja pakkuda vahendeid, et vĂ€ltida mĂ€lupiire ĂŒletavatest vigadest pĂ”hjustatud probleeme. Töö keskendub kahele suunale: arendusmudeli pakkumine, mis vĂ”imaldab turvaliselt töötada mĂ€lupuhvriga, ja standardse libc++ funktsioonide teegi kaitse tugevdamine.
C++ jaoks pakutav turvalise programmeerimise mudel eeldab standardse teegi pakutavate klasside kasutamist puhverdatud andmete töötlemiseks, selle asemel et manipuleerida toorete pointeritega. NĂ€iteks soovitatakse kasutada klasse std::array, std::vector ja std::span, millele lisatakse jooksva kontrollimise kĂ€igus mĂ€lu piire ĂŒletava juurdepÀÀsu kontroll.
Ohtlike programmeerimispraktikate vastu vĂ”itlemiseks pakub clang vĂ€lja kĂ”ikide pointeritega seotud aritmeetiliste operatsioonide jaoks kompilaatori hoiatusi, sarnaseid clang-tidy linteri hoiatusetele, mis kuvatakse, kui kasutada lippu âcppcoreguidelines-pro-bounds-pointer-arithmeticâ, mille tugi lisandub LLVM 16 vĂ€ljaandes. Nende hoiatuste aktiveerimiseks lisatakse clangisse eraldi lipp, mis ei ole vaikimisi aktiveeritud.
Libc++ kavas on rakendada valikulist tugevdatud kaitse reĆŸiimi, mille aktiveerimisel tuvastatakse mĂ”ned olukorrad, mis pĂ”hjustavad mÀÀramatut kĂ€itumist. NĂ€iteks jĂ€lgitakse klassides std::span ja std::vector, kas juurdepÀÀs ĂŒletab eraldi eraldatud mĂ€lu, ja kui see on tĂ”endatud, lĂ”petatakse programm hĂ€daseisundis. Arendajad usuvad, et sarnaste muudatuste lisamine sĂ€ilitab libc++ vastavuse C++ standarditele, kuna mÀÀramatute olukordade töötlemise meetodi valik lasub raamatukogu arendajate Ă”lul, kes vĂ”ivad tĂ”lgendada mÀÀramatut kĂ€itumist ka kui tĂ”rget, mis nĂ”uab programmi lĂ”petamist.
Libc++ ajal kĂ€ivitatavaid kontrolleritavaid kontrolle plaanitakse jagada kategooriatesse, mida saab eraldi aktiveerida. MĂ”ned ettepanekud kontrollide, mis ei too kaasa toimingute keerukuse suurenemist vĂ”i ABI muutmist, on juba teostatud libc++ turvareĆŸiimi (safe mode) raames.
Lisaks on plaanis vĂ€lja töötada tööriistakomplekt, mis vĂ”imaldab taastada koodi, asendades muutujad paljaste pointeritega konteineritega ja rakendades alternatiivseid töötlejaid olukordades, kus konteiner ei saa otseselt pointerit asendada (nĂ€iteks konstruktsioon "if(array_pointer)" vĂ”ib olla muudetud "if(span.data()"). Korrektsioone saab rakendada mitte ainult kohalikule muutujale, vaid ka pointeritega tĂŒĂŒpide parameetritele.
Allikas: opennet.ru
