Проектът 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++.

Освен това се планира да се подготви набор от инструменти за коригиране на кода, което ви позволява да заменяте променливи с голи указатели върху контейнери и да прилагате алтернативни манипулатори в ситуации, когато контейнерът не може директно да замени указателя (например „if (array_pointer)“ конструкцията може да се преобразува в „if (span.data ()"). Корекциите могат да се прилагат не само към локални променливи, но и към параметри на типа с указатели.

Източник: opennet.ru

Добавяне на нов коментар