LLVM долбоору C++ тилинде буферлер менен коопсуз иштөө үчүн куралдарды иштеп чыгууда

LLVM долбоорун иштеп чыгуучулар C++ миссиясы үчүн маанилүү долбоорлордун коопсуздугун чыңдоого жана буферлердин ашып кетишинен келип чыккан каталарды жоюуга багытталган бир катар өзгөртүүлөрдү сунушташты. Иш эки багытка багытталган: буферлер менен коопсуз иштөөгө мүмкүндүк берүүчү өнүктүрүү моделин камсыз кылуу жана libc++ функциялардын стандарттык китепканасын күчөтүү үчүн иштөө.

C++ үчүн сунушталган коопсуз программалоо модели жылаңач көрсөткүчтөрдү манипуляциялоонун ордуна буферлер менен иштөөдө стандарттык китепкана тарабынан берилген класстарды колдонууну камтыйт. Мисалы, std::array, std::vector жана std::span класстарын колдонуу сунушталат, алар ашыкча бөлүнгөн эстутумдун иштөө убактысын текшерүүнү кошот.

Кленгдеги кооптуу программалоо практикалары менен күрөшүү үчүн, "cppcoreguidelines-pro-bounds-pointer-arithmetic" желекчесин колдонууда clang-tidy linter эскертүүлөрүнүн чыгышына окшош бардык көрсөткүчтөрдүн арифметикалык операциялары үчүн компилятордун эскертүүлөрүн көрсөтүү сунушталат. LLVM 16 чыгарылышында пайда болот. Мындай эскертүүлөрдү иштетүү үчүн, демейки боюнча жигердүү эмес, clangга өзүнчө желек кошулат.

libc++ ичинде кошумча күчөтүлгөн коргоо режимин ишке ашыруу пландаштырылууда, ал иштетилгенде, иштөө убагында аныкталбаган жүрүм-турумга алып келген кээ бир кырдаалдарды кармап калат. Мисалы, std::span жана std::вектор класстарында эстутумдун чегинен тышкаркы жетүү көзөмөлдөнөт жана аныкталса, программа бузулат. Иштеп чыгуучулар мындай өзгөртүүлөрдү кошуу libc++ти C++ стандарттарына ылайык сактап калат деп ишенишет, анткени аныкталбаган жүрүм-турум учурларын кантип чечүү керектиги китепкананы иштеп чыгуучуларга жүктөлөт, алар башка нерселер менен катар аныкталбаган жүрүм-турумду ийгиликсиздик катары кабыл алышы мүмкүн. токтотуу үчүн программа.

libc++ ичинде иштөө убактысын текшерүүлөрдү жекече иштете турган категорияларга бөлүү пландаштырылууда. Операциялардын татаалдыгына же ABIге өзгөртүүлөрдү алып келбеген сунуш кылынган текшерүүлөрдүн айрымдары libc++ коопсуз режиминде мурунтан эле ишке ашырылган.

Кошумчалай кетсек, кодду жаңыртуу үчүн инструменттерди даярдоо пландаштырылууда, бул өзгөрмөлөрдү контейнерлер менен жылаңач көрсөткүчтөр менен алмаштырууга жана контейнер көрсөткүчтү түздөн-түз алмаштыра албаган учурларда альтернативдик иштеткичтерди колдонууга мүмкүндүк берет (мисалы, “if(array_pointer)” конструкциясы "if(span.data) ()"). Түзөтүүлөр жергиликтүү өзгөрмөлөргө гана эмес, көрсөткүчтөрдүн түрлөрүнүн параметрлерине да колдонулушу мүмкүн.

Source: opennet.ru

DDoS коргоосу, VPS VDS серверлери бар сайттар үчүн ишенимдүү хостинг сатып алыңыз 🔥 DDoS коргоосу, VPS VDS серверлери бар ишенимдүү веб-сайт хостингин сатып алыңыз | ProHoster