Часу обмаль: Б’ярн Страуструп наполягає на негайних змінах для збереження C++
Б’ярн Страуструп, творець C++, закликав комітет WG21 терміново вжити заходів для збереження актуальності мови на тлі зростаючого інтересу до безпечніших мов програмування, які мінімізують помилки у роботі з пам’яттю.
На його думку, дедлайн близько: до 2026 року Агентство з кібербезпеки та ФБР рекомендують розробникам перейти на безпечні мови або впровадити механізми захисту від помилок у роботі з пам’яттю.
Щоб забезпечити конкурентоспроможність C++, Страуструп пропонує стандартизовану систему профілів, яка дозволить писати безпечний код без необхідності переходу на інші мови. Вона працюватиме подібно до компіляторних флагів -Wall
та -Wextra
, але вводитиме суворіші обмеження на рівні синтаксису, забороняючи небезпечні конструкції.
Запропоновані профілі охоплюють безпечні типи, контроль часу життя об’єктів, перевірку діапазонів значень, роботу з цілочисельною арифметикою та механізми запобігання станам гонки. Їх можна застосовувати на рівні проєкту, файлів чи окремих конструкцій.
Реалізація цих змін дозволить поетапно підвищувати безпеку коду, уникаючи використання сирих покажчиків, неконтрольованого приведення типів і звернень до неініціалізованих об’єктів. Наприклад, сирі покажчики можна замінити на std::unique_ptr
та std::shared_ptr
, а традиційні std::vector
із безпечним перебором елементів.
Серед запропонованих профілів:
- type — кожен об’єкт має бути ініціалізований, приведення типів заборонене.
- lifetime — заборонені посилання на звільнену або невикористану пам’ять, розіменування покажчиків, явний виклик new/delete.
- bounds — обов’язкова перевірка допустимих діапазонів при роботі з покажчиками, заборонені арифметичні операції з покажчиками.
- arithmetic — блокуються цілочисельні переповнення, заборонені знакові/беззнакові перетворення, що змінюють значення.
- concurrency — виключає операції, які можуть призвести до взаємних блокувань і станів гонки.
- RAII — вимагає контролю володіння кожним ресурсом.
Це забезпечує такі гарантії, як відповідність звернення до об’єкта його визначеному типу, коректне створення та звільнення кожного об’єкта, вказування покажчика лише на коректний об’єкт або нульовий покажчик. Крім того, жодне посилання через покажчик не може здійснюватися через нульовий покажчик, а кожне звернення через індексований покажчик має залишатися в межах допустимого діапазону.
Як Ви вважаєте: це рішення допоможе C++ утриматися на плаву, чи його час уже сплив, і корабель приречений піти на дно?
Найкращі коментарі пропустити