ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Реализация профилей безопасности для С++26

Open rsashka opened this issue 4 months ago • 0 comments

Реализация профилей безопасности для С++26

Профили безопасности и безопасная работа с памятью

Профили безопасности для С++ в текущем виде p3038 от Bjarne Stroustrup и P3081 от Herb Sutter не выдерживают критики из-за отсутствия реализации и фрагментарности предложений. По сути, это лишь заготовка, чтобы показать, что язык С++ хочет оставаться в тренде по текущим вызовам безопасной разработки ПО, но факту выходит, что конкретно нужно делать - не совсем непонятно, так как теоретическая основа проработана лишь частично.

Тем не менее и откладывать вопросы безопасности тоже не правильно из-за наличия запроса от посльзователей языка.

Мое предложение по реализациям профилей безопасности в С++26 стандарте состоит в том, чтобы предоставить создателям компиляторов и всем разработчиком минимальный универсальный инструмент, который бы позволял им самим настраивать требуемые профили безопасности без навязывания тех или иных частичных решений:

  • добавить в язык конструкцию/атрибут включения / выключения безопасности и с поведением без нарушения обратную совместимость с уже существующим исходным кодом, например атрибуты [[safe]] и [[unsafe]].
  • Весь код по умолчанию считается безопасным (поведение по умолчанию можно изменить флагами компилятора).
  • Все определения и операции с указателями, итераторами и пр. ссылочными данными считаются не безопасными, если компилятор не может гарантировать безопасность операции / выражения в автоматическом режиме.
  • При компиляции безопасного кода, любой не безопасный код обязан выдавать предупреждение или ошибку.
  • Предупреждение или ошибка не безопасного кода можно подавить специальной конструкцией [[unsafe]], в этом случае программист берет на себя ответственность за корректность реализации данного фрагмента кода.
  • Оператор или атрибут не безопасного кода может быть применен для одной операции (определения) или для целого фрагмента кода.
  • Компилятор должен иметь опцию для игнорирования подавления сообщений о нарушении безопасности (опция компилятора, которая отменяет действия всех не безопасных фрагментов кода).
  • Добавить оператор/атрибут для ручного формирования сообщения с предупреждением или ошибкой безопасности.

Данное предложение является альтернативой C++ Profiles без конкретизации различных шаблонов безопасности и без разделения С++ на разные диалекты языка, но позволяет свободно решать вопросы безопасности в рамках стандарта С++ как в виде отдельных библиотек и/или плагинов для компилятора без нарушения обратной совместимости с уже существующим исходным кодом на С++.

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

rsashka avatar Aug 12 '25 11:08 rsashka