Projekti LLVM po zhvillon mjete për të punuar me buffer në mënyrë të sigurt në C++

Zhvilluesit e projektit LLVM kanë propozuar një sërë ndryshimesh që synojnë forcimin e sigurisë së projekteve C++ kritike për misionin dhe sigurimin e një mjeti për të eliminuar gabimet e shkaktuara nga tejkalimet e buferëve. Puna përqendrohet në dy fusha: ofrimi i një modeli zhvillimi që lejon punën e sigurt me buferët dhe puna për të forcuar sigurinë e bibliotekës standarde të funksioneve libc++.

Modeli i propozuar i programimit të sigurt për C++ përfshin përdorimin e klasave të ofruara nga biblioteka standarde kur punoni me buferë në vend të manipulimit të treguesve të zhveshur. Për shembull, propozohet përdorimi i klasave std::array, std::vector dhe std::span, të cilat do të shtojnë një kontroll të kohës së ekzekutimit për memorien e tejpërcaktuar.

Për të luftuar praktikat e rrezikshme të programimit në clang, propozohet të shfaqen paralajmërimet e përpiluesit për të gjitha operacionet aritmetike të treguesit, të ngjashme me daljen e paralajmërimeve të linterit clang-tidy kur përdorni flamurin "cppcoreguidelines-pro-bounds-pointer-arithmetic", mbështetje për të cilën do të shfaqen në versionin LLVM 16. Për të aktivizuar paralajmërime të tilla, një flamur i veçantë do t'i shtohet tingëllimit, jo aktiv si parazgjedhje.

Është planifikuar të zbatohet një mënyrë opsionale e mbrojtjes së zgjeruar në libc++, e cila, kur aktivizohet, do të kapë disa situata në kohën e ekzekutimit që çojnë në sjellje të papërcaktuar. Për shembull, në klasat std::span dhe std::vector, një akses memorie jashtë kufijve do të monitorohet dhe nëse zbulohet, programi do të rrëzohet. Zhvilluesit besojnë se shtimi i ndryshimeve të tilla do ta mbajë libc++ në përputhje me standardet C++, pasi zgjedhja se si të trajtohen rastet e sjelljes së papërcaktuar i takon zhvilluesve të bibliotekës, të cilët, ndër të tjera, mund ta trajtojnë sjelljen e papërcaktuar si një dështim, duke kërkuar program për të përfunduar.

Kontrollet e kohës së ekzekutimit në libc++ janë planifikuar të ndahen në kategori që mund të aktivizohen individualisht. Disa nga kontrollet e propozuara, të cilat nuk çojnë në kompleksitet të operacioneve ose ndryshime në ABI, janë zbatuar tashmë brenda modalitetit të sigurt libc++.

Për më tepër, është planifikuar të përgatitni mjete për rregullimin e kodit, duke ju lejuar të zëvendësoni variablat me tregues të zhveshur me kontejnerë dhe të përdorni mbajtës alternativë në situata kur kontejneri nuk mund të zëvendësojë drejtpërdrejt treguesin (për shembull, konstrukti "if(array_pointer)" mund të të konvertohet në "if(span.data) ()"). Rregullimet mund të aplikohen jo vetëm për variablat lokale, por edhe për parametrat e llojeve të treguesve.

Burimi: opennet.ru

Shto një koment