Skip to content

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

@rsashka

Description

@rsashka

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

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

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

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

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

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

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions