Разработчики LLVM предлагают безопасную обработку буфера на C++

Логотип ЛЛВМ

LLVM — это платформа для разработки компиляторов, а также помогающая создавать новые языки программирования и улучшать существующие языки.

разработчики проекта LLVM предложили ряд изменений, направленных на усиление безопасности проектов C + + критически важными и предоставляют средства для устранения ошибок, вызванных переполнением буфера.

Таким образом, выпущенное ими предложение фокусируется, в частности, на работе в двух областях: предоставление модели разработки, позволяющей безопасно работать с буферами, и работа над усилением безопасности стандартной библиотеки функций libc++.

Упоминается, что предлагаемая модель безопасного программирования для C++ «заключается в использовании классов, предоставляемых стандартной библиотекой, при работе с буферами вместо манипулирования необработанными указателями». Например, предлагается использовать классы std::array, std::vector и std::span, которые будут дополнены проверкой во время выполнения на наличие выхода за пределы выделенной памяти.

Наша цель — повысить безопасность критически важных баз кода C++. Для этого мы планируем работать над двумя идеями.

Усиленная стандартная библиотека C++
Модель программирования безопасного буфера C++ и средства внедрения
Hardened libc++ предназначен для того, чтобы в целом сделать интерфейсы стандартной библиотеки C++ более безопасными.

Модель программирования безопасного буфера C++ вместе с защищенной библиотекой libC++ обеспечивают уменьшение доступа к памяти за пределами памяти во время выполнения. Инструменты внедрения автоматизируют миграцию кода в эту новую модель программирования.

В дополнение к этому также упоминается, что для борьбы с «опасными» практиками программирования в клан, если предлагает выдавать предупреждения компилятора для всех арифметических операций с указателями, аналогично предупреждениям линтера clang-tidy при использовании флага "cppcoreguidelines-pro-bounds-pointer-arithmetic", поддержка которого появится в LLVM 16. Для включения таких предупреждений в clang будет добавлен отдельный флаг, неактивный по умолчанию .

Планируется реализовать опциональный режим защиты в libc++, который, если он включен, обнаружит некоторые ситуации, которые приводят к неопределенному поведению во время выполнения. Например, на занятиях std::span и std::vector, будет отслеживаться доступ за границу, и в этом случае программа завершится ошибкой.

Эти дополнительные проверки во время выполнения будут сгруппированы в несколько категорий, которыми можно управлять отдельно. Цель состоит в том, чтобы поставщик, поставляющий libc++ на своей платформе, мог решить, какие проверки включить в поставляемой библиотеке (если таковые имеются), в зависимости от желаемого уровня безопасности.

Разработчики считают, что добавление таких изменений сохранит соответствие libc++ стандартам C++, поскольку выбор того, как обрабатывать случаи неопределенного поведения, остается за разработчиками библиотеки, которые могут, среди прочего, трактовать неопределенное поведение как блокировку, требующую от программы выход.

Лас- runtime-проверки в libc++ планируется разделить на категории которые могут быть включены индивидуально. Некоторые из предлагаемых проверок, которые не приводят к более сложным операциям или изменениям ABI, уже реализованы в безопасном режиме libc++ (безопасный режим).

Повторим еще раз: конечной целью для поставляемой библиотеки является обеспечение возможности этих проверок в рабочей среде; это не функция «только отладки», хотя в конечном итоге она заменит давно неработающий «режим отладки».

Кроме того, планируется подготовить набор средств исправления кода что позволит заменять переменные необработанными указателями в контейнерах и применять альтернативные обработчики в ситуациях, когда контейнер не может напрямую заменить указатель (например, конструкция «if(array_pointer)» может быть преобразована в «if(span.data ( )»). Настройки можно применять не только к локальным переменным, но и к параметрам типа с указателями.

Также упоминается, что рассматривают "проверку статического анализатора clang" чувствительный к маршруту, который предупреждает, если std :: span создается из контейнера, который меньше размера, указанного в конструкторе диапазона. Упомянутая проверка является автономной и полезной сама по себе, если все пойдет хорошо, она будет включена по умолчанию для всех пользователей.

В конце концов если вам интересно узнать об этом больше, вы можете проверить подробности в по следующей ссылке.


Будьте первым, чтобы комментировать

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: AB Internet Networks 2008 SL
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.