LLVM projekts izstrādā bufera drošu apstrādi C++ valodā

LLVM projekta izstrādātāji ir ierosinājuši vairākas izmaiņas, kuru mērķis ir stiprināt misijai kritisko C++ projektu drošību un nodrošināt līdzekļus bufera pārtēriņa radīto kļūdu novēršanai. Darbs ir vērsts uz divām jomām: izstrādes modeļa nodrošināšanu, kas ļauj droši strādāt ar buferiem, un darbu pie libc++ standarta funkciju bibliotēkas drošības nostiprināšanas.

Piedāvātais drošas programmēšanas modelis C++ ir izmantot standarta bibliotēkas nodrošinātās klases, strādājot ar buferiem, nevis manipulējot ar tukšām norādes. Piemēram, tiek piedāvāts izmantot klases std::masīvs, std::vector un std::span, kuras tiks pievienotas ar izpildes laika pārbaudi, lai atrastu ārpus robežām piešķirto atmiņu.

Lai cīnītos pret bīstamām programmēšanas praksēm, tiek ierosināts izdot kompilatora brīdinājumus par visām rādītāja aritmētiskajām darbībām, līdzīgi clang-tidy brīdinājumiem, izmantojot karodziņu "cppcoreguidelines-pro-bounds-pointer-aritmētika", kura atbalsts parādīsies laidienu LLVM 16. Lai iespējotu šādus brīdinājumus, clang tiks pievienots atsevišķs karodziņš, kas pēc noklusējuma nav aktīvs.

Programmā libc++ ir plānots ieviest papildu rūdītās aizsardzības režīmu, kas, iespējots, uztvers dažas situācijas, kas izpildes laikā noved pie nedefinētas uzvedības. Piemēram, std::span un std::vector klasēs tiks uzraudzīta piekļuve ārpus robežām, un tādā gadījumā programma avarē. Izstrādātāji uzskata, ka šādu izmaiņu pievienošana saglabās libc++ saderību ar C++ standartiem, jo ​​izvēle, kā rīkoties nedefinētas darbības gadījumos, ir bibliotēkas izstrādātāju ziņā, kas cita starpā var interpretēt nedefinētu darbību kā avāriju, kas prasa programma, lai izietu.

Izpildlaika pārbaudes programmā libc++ plānots sadalīt kategorijās, kuras var iekļaut atsevišķi. Dažas no ieteiktajām pārbaudēm, kas neizraisa sarežģītākas darbības vai ABI izmaiņas, jau ir ieviestas libc++ drošajā režīmā.

Papildus plānots sagatavot rīku komplektu koda labošanai, kas ļaus konteineros aizstāt mainīgos ar tukšiem rādītājiem un izmantot alternatīvus apdarinātājus situācijās, kad konteiners nevar tieši aizstāt rādītāju (piemēram, “if (masīva_rādītājs)” Construct var pārvērst par “if (span.data ()”). Korekcijas var piemērot ne tikai lokālajiem mainīgajiem, bet arī tipa parametriem ar rādītājiem.

Avots: opennet.ru

Pievieno komentāru