-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Реализация профилей безопасности для С++26
Профили безопасности и безопасная работа с памятью
Профили безопасности для С++ в текущем виде p3038 от Bjarne Stroustrup и P3081 от Herb Sutter не выдерживают критики из-за отсутствия реализации и фрагментарности предложений. По сути, это лишь заготовка, чтобы показать, что язык С++ хочет оставаться в тренде по текущим вызовам безопасной разработки ПО, но факту выходит, что конкретно нужно делать - не совсем непонятно, так как теоретическая основа проработана лишь частично.
Тем не менее и откладывать вопросы безопасности тоже не правильно из-за наличия запроса от посльзователей языка.
Мое предложение по реализациям профилей безопасности в С++26 стандарте состоит в том, чтобы предоставить создателям компиляторов и всем разработчиком минимальный универсальный инструмент, который бы позволял им самим настраивать требуемые профили безопасности без навязывания тех или иных частичных решений:
- добавить в язык конструкцию/атрибут включения / выключения безопасности и с поведением без нарушения обратную совместимость с уже существующим исходным кодом, например атрибуты
[[safe]]и[[unsafe]]. - Весь код по умолчанию считается безопасным (поведение по умолчанию можно изменить флагами компилятора).
- Все определения и операции с указателями, итераторами и пр. ссылочными данными считаются не безопасными, если компилятор не может гарантировать безопасность операции / выражения в автоматическом режиме.
- При компиляции безопасного кода, любой не безопасный код обязан выдавать предупреждение или ошибку.
- Предупреждение или ошибка не безопасного кода можно подавить специальной конструкцией
[[unsafe]], в этом случае программист берет на себя ответственность за корректность реализации данного фрагмента кода. - Оператор или атрибут не безопасного кода может быть применен для одной операции (определения) или для целого фрагмента кода.
- Компилятор должен иметь опцию для игнорирования подавления сообщений о нарушении безопасности (опция компилятора, которая отменяет действия всех не безопасных фрагментов кода).
- Добавить оператор/атрибут для ручного формирования сообщения с предупреждением или ошибкой безопасности.
Данное предложение является альтернативой C++ Profiles без конкретизации различных шаблонов безопасности и без разделения С++ на разные диалекты языка, но позволяет свободно решать вопросы безопасности в рамках стандарта С++ как в виде отдельных библиотек и/или плагинов для компилятора без нарушения обратной совместимости с уже существующим исходным кодом на С++.
Примеры кода с использованием предложенной концепции представлен в библиотеке MemSafe , которая реализует модель безопасной работы с памятью для С++ в виде заголовочного файла и плагина компилятора с маркировкой объектов в исходном коде с помощью C++ атрибутов.