Праект LLVM развівае сродкі для бяспечнай працы з буферамі ў C++

Распрацоўнікі праекту LLVM прапанавалі шэраг змен, накіраваных на ўзмацненне бяспекі крытычна важных праектаў на мове C++ і падаванне сродкаў для выключэння памылак, выкліканых вынахадам за дапушчальныя межы буфераў. Праца засяроджана ў двух кірунках: прадастаўленне мадэлі распрацоўкі, якая дазваляе бяспечна працаваць з буферамі, і правядзенне працы па ўзмацненні абароны стандартнай бібліятэкі функцый libc++.

Прапанаваная мадэль бяспечнага праграмавання для C++ мяркуе выкарыстанне якія прадстаўляюцца стандартнай бібліятэкай класаў пры працы з буферамі замест маніпуляцый з голымі паказальнікамі. Напрыклад, прапануецца выкарыстоўваць класы std::array, std::vector і std::span, у якія будзе дададзеная праверка выхаду за межы выдзеленай памяці, якая праводзіцца падчас выканання.

Для барацьбы з небяспечнымі прыёмамі праграмавання ў clang прапануецца выводзіць папярэджанні кампілятара для ўсіх арыфметычных аперацый з паказальнікамі, падобныя на папярэджанні linter-а clang-tidy, якія выводзяцца пры выкарыстанні сцяга "cppcoreguidelines-pro-bounds-pointer-arithmetic", падтрымка якога з'явіцца ў выпуску LLVM 16. Для ўключэння падобных папярэджанняў у clang будзе дададзены асобны сцяг, не актыўны па змаўчанні.

У libc++ плануецца рэалізаваць апцыянальны рэжым узмоцненай абароны, пры ўключэнні якога падчас выканання будуць адлоўлівацца некаторыя сітуацыі, якія прыводзяць да нявызначаных паводзін. Напрыклад, у класах std::span і std::vector будзе адсочвацца зварот за межы выдзеленай вобласці памяці, у выпадку выяўлення якога праграма будзе аварыйна завяршацца. Распрацоўнікі лічаць, што даданне падобных змен захавае адпаведнасць libc++ стандартам C++, бо выбар метаду апрацоўкі выпадкаў нявызначаных паводзін ляжыць на распрацоўніках бібліятэкі, якія могуць у тым ліку тлумачыць нявызначаныя паводзіны як збой, патрабавальных завяршэнні працы праграмы.

Вырабляныя падчас выканання праверкі ў libc++ плануюць падзяліць на катэгорыі, якія можна будзе ўключаць па асобнасці. Некаторыя з прапанаваных праверак, якія не прыводзяць да ўскладнення аперацый або змены ABI, ужо рэалізаваны ў рамках бяспечнага рэжыму libc++ (safe mode).

Дадаткова плануецца падрыхтаваць інструментар для карэкціроўкі кода, які дазваляе замяняць зменныя з голымі паказальнікамі на кантэйнеры і прымяняць альтэрнатыўныя апрацоўшчыкі ў сітуацыях, калі кантэйнер не можа напрамую замяніць паказальнік (напрыклад, канструкцыя «if(array_pointer)» можа быць пераўтворана ў «if(span.data) ()») Карэкціроўкі могуць прымяняцца не толькі да лакальных пераменных, але і да параметраў тыпаў з паказальнікамі.

Крыніца: opennet.ru

Дадаць каментар