Концепция Trusted-CPP
Концепция безопасной работы с памятью в Trusted-CPP заключается в реализации следующих принципов:
Основные принципы
-
Гарантированное освобождение памяти: Если в программе гарантированно отсутствуют сильные циклические ссылки (ссылка объекта на самого себя или перекрёстные ссылки между несколькими объектами), тогда при реализации принципа RAII автоматическое освобождение памяти будет выполняться всегда.
-
Предотвращение циклов на уровне типов: Гарантировать отсутствие циклических ссылок можно только путем их запрета на уровне типов (определений классов).
-
Защита от гонок данных: Проблема гонок данных при обращении к памяти из разных потоков решается за счёт использования объектов межпотоковой синхронизации. Чтобы исключить ошибки в логике, для захвата объекта синхронизации и разыменования ссылки используется единый оператор (вызов функции).
Подход к реализации
Концепция безопасной работы с памятью была перенесена в C++ из языка NewLang, но реализована на базе стандартных шаблонных классов C++ shared_ptr и weak_ptr.
Основное отличие новых шаблонов заключается в способе обращения к объекту, который может выполняться не только с помощью разыменования “*”, но и через захват (блокировку) ссылки с сохранением её во временную переменную. Время жизни этой переменной ограничено и управляется компилятором автоматически, и уже через неё осуществляется доступ к самим данным (объекту).
Такая автоматическая переменная является временным владельцем сильной ссылки и выполняет функции удержания объекта межпотоковой синхронизации в стиле std::lock_guard — удержание объекта синхронизации в течение текущей области видимости, после чего он автоматически удаляется компилятором.
Безопасность памяти через статический анализ
Наш плагин для Clang выполняет статический анализ кода C++ во время компиляции. Он проверяет инвалидацию ссылочных типов (итераторов, std::span, std::string_view и т.д.) при изменении данных в исходной переменной и контролирует сильные циклические ссылки на уровне типов (определений классов) любой вложенности.
Механизмы потоковой безопасности
Библиотека обеспечивает автоматическую защиту от гонок данных при доступе к общим переменным из разных потоков. Способ контроля доступа необходимо указать при определении переменной, после чего захват и освобождение объекта синхронизации будут происходить автоматически при разыменовании ссылки.
По умолчанию общие переменные создаются без контроля многопоточного доступа и не имеют дополнительных накладных расходов по сравнению со стандартными шаблонными классами std::shared_ptr и std::weak_ptr.
Обратная совместимость
Одним из ключевых аспектов Trusted-CPP является сохранение полной обратной совместимости с существующим кодом C++. Система работает с C++20, но может быть адаптирована для работы с C++17 или даже C++11 с минимальными изменениями.