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

Додати коментар або відгук