Zhvilluesit e projektit LLVM kanë propozuar një sërë ndryshimesh për të forcuar sigurinë e projekteve të rëndësishme në gjuhën C++ dhe për të ofruar mjete për të eliminuar gabimet e shkaktuara nga dalja jashtë kufijve të lejuar të tamponëve. Puna përqendrohet në dy drejtime: ofrimi i një modeli zhvillimi që lejon punën e sigurt me tamponët dhe forcimi i mbrojtjes së bibliotekës standarde të funksioneve libc++.
Modeli i propozuar i programimit të sigurt për C++ parashikon përdorimin e klasave të ofruara nga biblioteka standarde kur punoni me tamponët, në vend të manipulimeve me tregues të papërpunuar. Për shembull, sugjerohet të përdoren klasat std::array, std::vector dhe std::span, të cilat do të shtojnë një kontroll për daljen jashtë kufijve të memories të ndarë, i realizuar gjatë ekzekutimit.
Për të luftuar me praktikat e rrezikshme të programimit, në clang propozohet që të jepen paralajmërime të kompilatorit për të gjitha operacionet aritmetike me tregues, të ngjashme me paralajmërimet e linter-it clang-tidy, të paraqitura kur përdoret flaga «cppcoreguidelines-pro-bounds-pointer-arithmetic», mbështetje për të cilin do të vendoset në publikimin e LLVM 16. Për përfshirjen e paralajmërimeve të tilla në clang do të shtohet një flag i veçantë, i cili nuk është aktiv nga ana e paracaktuar.
Në libc++ planifikohet që të implementohet një mod i opsional i mbrojtjes së forcuar, i cili gjatë ekzekutimit do të kap disa situata që çojnë në sjellje të panjohura. Për shembull, në klasat std::span dhe std::vector do të monitorohet qasja jashtë perimetrit të memories të ndarë, dhe në rastin e zbulimit, programi do të mbyllet. Zhvilluesit besojnë se shtimi i ndryshimeve të tilla do të ruajë përputhshmërinë e libc++ me standardet C++, pasi zgjedhja e metodës për përpunimin e rasteve të panjohura është në duar të zhvilluesve të bibliotekës, të cilët mund të interpretojnë gjithashtu sjelljen e panjohur si një dështim që kërkon ndalimin e funksionimit të programit.
Kontrollimet që realizohen gjatë ekzekutimit në libc++ planifikohen të ndahen në kategori, të cilat do të mund të aktivizohen veçmas. Disa nga kontrollet e propozuara, të cilat nuk çojnë në komplikimin e operacioneve ose ndryshimin e ABI, tashmë janë realizuar në kuadrin e modit të sigurt libc++ (safe mode).
Përveç kësaj, planifikohet përgatitja e një mjeti për rregullimin e kodit, që lejon zëvendësimin e variablave me tregues të papërpunuar me konteinerë dhe aplikimin e trajtuesve alternativ në situata kur kontejneri nuk mund të zëvendësojë drejtpërdrejt treguesin (për shembull, ndërtimi «if(array_pointer)» mund të transformohet në «if(span.data()»). Rregullimet mund të aplikohen jo vetëm në variablat lokalë, por edhe në parametrat e tipave me tregues.
Burimi: opennet.ru
