Проектът LLVM развива средства за безопасна работа с буфери в C++

Разработчиците на проекта LLVM предложиха редица изменения, насочени към повишаване на сигурността на критично важни проекти на C++ и предоставяне на средства за избягване на грешки, причинени от излизане извън допустимите граници на буферите. Работата е съсредоточена в две направления: предоставяне на модел за разработка, позволяващ безопасна работа с буфери, и укрепване на защитата на стандартната библиотека функции libc++.

Предложеният модел за безопасно програмиране на C++ предвижда използване на класовете, предоставени от стандартната библиотека, при работа с буфери в вместо манипулации с голи указатели. Например, предложено е да се използват класовете std::array, std::vector и std::span, в които да бъде добавена проверка за излизане извън границите на заделената памет, извършвана по време на изпълнение.

За да се справи с опасните практики на програмиране, в clang се предлага да се показват предупреждения на компилатора за всички аритметични операции с указатели, подобни на предупрежденията на linter-а clang-tidy, издавани при използване на флага „cppcoreguidelines-pro-bounds-pointer-arithmetic“, чиято поддръжка ще бъде включена в версия 16 на LLVM. За включване на такива предупреждения в clang ще бъде добавен отделен флаг, който по подразбиране ще бъде деактивиран.

В libc++ се планира реализиране на опционален режим на усилена защита, при активиране на който по време на изпълнение ще се улавят някои ситуации, водещи до неопределено поведение. Например, в класовете std::span и std::vector ще се следи за достъп извън заделената памет, при идентифициране на който програмата ще приключи аварийно. Разработчиците смятат, че добавянето на такива промени ще запази съответствието на libc++ със стандартите на C++, тъй като изборът на метод за обработка на случаите на неопределено поведение е оставен на разработчиците на библиотеката, които могат да тълкуват неопределеното поведение като срив, изискващ спиране на програмата.

По време на проверка, извършвана в libc++, планират да разделят проверките на категории, които могат да се включват поотделно. Някои от предложените проверки, които не усложняват операциите или не променят ABI, вече са реализирани в рамките на безопасния режим на libc++ (safe mode).

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

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster