Как стать автором
Обновить

Страуструп призвал комитет WG21 заняться актуальностью C++ из-за продвижения языков для безопасной работы с памятью

Время на прочтение5 мин
Количество просмотров9.3K

В начале марта 2025 года Бьёрн Страуструп призвал отвечающий за разработку стандартов для языка C++ комитет WG21 принять меры для сохранения актуальности C++ в условиях активного продвижения инициатив по переходу на языки, обеспечивающие безопасную работу с памятью.

По информации OpenNET, Страуструп считает, что язык С++ уже предоставляет все возможности, необходимые для безопасной работы с памятью. Остаётся только предоставить средства, гарантирующие, что код написан с использованием только безопасных возможностей.

По мнению Страуструпа, времени осталось очень мало и необходимо до 2026 года успеть предпринять какие‑то меры, так как Агентство по кибербезопасности и защите инфраструктуры США и ФБР стали более активно продвигать среди производителей ПО идею перехода на языки, которые безопасно работают с памятью. До 2026 года производителям ПО рекомендовано разработать план по применению в своих продуктах технологий, защищающих от ошибок при работе с памятью, или переходу на использование языков, безопасно работающих с памятью.

Стандартизация возможностей для безопасной разработки на C++ позволит сохранить интерес к языку С++, особенно с учётом того, что разработчики существующих проектов на С и C++ смогут постепенно наращивать безопасность своих продуктов, не прибегая к инициативам по переписыванию на другом языке. В частности, проекты на C можно преобразовать в код С++, а за тем поэтапно переводить код на безопасные конструкции, следуя рекомендациям из руководства «C++ Core Guidelines».

Для обеспечения разработки безопасного кода Страуструп предлагает стандартизировать систему профилей C++, вводящих дополнительные требования к коду. Профили близки к применению флагов «‑Wall» и «‑Wextra» при компиляции, но в отличие от них работают на уровне запрета применения определённых возможностей языка. К реализации предлагаются профили для безопасных типов, контроля времени жизни объектов, работы с допустимыми диапазонами значений и целочисленной арифметики. Привязку к профилям можно задавать не только для проекта и файлов (например, «[[profile::enforce(type)]]»), но и включать/отключать на уровне отдельных конструкций (например, «[profile::suppress(lifetime))] this→succ = this→succ→succ;»).

Работа по повышению безопасности будет сводится к включению профиля для определённого кода и переписыванию частей, использующих небезопасные возможности языка, охватываемые выбранным профилем. Например, использование профилей поможет уйти от применения в коде сырых указателей и массивов, избавиться приведения типов и защититься от обращений к неинициализированным объектам. Вместо сырых указателей можно использовать, например, умные указатели std::unique_ptr и std::shared_ptr с отслеживанием владения. При наличии в коде циклов «for», перебирающих отдельные элементы Си‑массива, потребует заменить данные циклы на вариант с обработкой диапазонов «for(type variable: vector)», использующий std::vector.

Предложены следующие профили:

  • type — каждый объект должен быть инициализирован, не допускается приведение типов.

  • lifetime — запрещены ссылки на освобождённые или неиспользуемые области памяти, разыменование указателей, явный вызов new/delete.

  • bounds — требуется проверка допустимых диапазонов при работе с указателями, запрещены арифметические операции с указателями.

  • arithmetic — блокируются целочисленные переполнения, запрещены знаковые/беззнаковые преобразования, изменяющие значение.

  • concurrency — исключает операции, приводящие к взаимным блокировкам и состояниям гонки.

  • RAII (Resource Acquisition Is Initialization) — требует проверки владения для каждого ресурса.

Гарантии, реализуемые при использовании профилей:

  • Обращение к объекту допускается только в соответствии с типом, под которым этот объект был определён.

  • Каждый объект должен быть корректно создан и освобождён.

  • Каждый указатель должен указывать на корректный объект или нулевой указатель.

  • Каждая ссылка через указатель не должна переходить по нулевому указателю.

  • Каждое обращение через индексированный указатель должно находиться в пределах допустимого диапазона.

В начале февраля Бьёрн Страуструп представил «профили» для обеспечения безопасности ресурсов и типов в рамках проекта «C++ на стероидах», чтобы помочь разработчикам сосредоточиться на эффективном использовании современного C++ и избежать устаревших «тёмных углов» языка. Он пожаловался, что многие разработчики «используют C++ так, как будто это все ещё предыдущее тысячелетие», в своей новой статье под названием «21st Century C++».

11 сентября 2024 года разработчик Шон Бакстер (Sean Baxter) представил драфт основного документа проекта Safe C++ для продвижения внедрения безопасного кода на C++, включая запрет на использование небезопасных методов работы с памятью, вместо перевода проектов на Rust.

В январе 2023 года изобретатель языка программирования C++ Бьёрн Страуструп ответил Агентству национальной безопасности (АНБ) США по поводу рекомендации ведомства отказаться от использования языков C и C++, перекладывающих управление памятью на разработчика, в пользу современных языков программирования (C#, Go, Java, Ruby, Rust и Swift), которые обеспечивают автоматическое управление памятью или выполняющие проверки безопасной работы с памятью во время компиляции кода. Страуструп призвал АНБ со своей стороны сначала серьёзно подумать о «безопасности» новых языков и только потом предлагать что‑нибудь разумное по этому поводу. Учёный и разработчик считает, что упомянутые в отчёте АНБ «безопасные» языки программирования на самом деле не превосходят C++ в важных с его точки зрения применениях.

В конце февраля 2024 года Офис национального директора по кибербезопасности (ONCD) Белого дома США в рамках доклада о способах снижения количества уязвимостей в проектах и возможности в будущем улучшить надёжность ПО призвал разработчиков ПО в долгосрочной перспективе отказаться от небезопасных (в рамках работы с памятью) языках программирования С и С++ и перейти на более современные решения с высокой безопасностью памяти, например Rust, Python и Java.

Страуструп ответил на призыв Белого дома США переходить на языки с безопасностью памяти: «Я нахожу удивительным, что авторы этих государственных документов, похоже, не знают о сильных сторонах современного C++ и усилиях по обеспечению сильных гарантий безопасности. С другой стороны, они понимают, что язык программирования — это лишь одна часть набора инструментов, поэтому важно улучшать инструменты и процессы разработки». Страуструп напомнил, как он работал десятилетиями над тем, чтобы сделать язык безопаснее. Наконец, он поставил под сомнение само понимание безопасности: критики фокусируются на безопасности памяти, оставляя без внимания многие другие места, где можно проколоться.

Теги:
Хабы:
Всего голосов 12: ↑12 и ↓0+15
Комментарии55

Другие новости