Trusted-CPP Documentation

Концепция Trusted-CPP

Концепция безопасной работы с памятью в Trusted-CPP заключается в реализации следующих принципов:

Основные принципы

  1. Гарантированное освобождение памяти: Если в программе гарантированно отсутствуют сильные циклические ссылки (ссылка объекта на самого себя или перекрёстные ссылки между несколькими объектами), тогда при реализации принципа RAII автоматическое освобождение памяти будет выполняться всегда.

  2. Предотвращение циклов на уровне типов: Гарантировать отсутствие циклических ссылок можно только путем их запрета на уровне типов (определений классов).

  3. Защита от гонок данных: Проблема гонок данных при обращении к памяти из разных потоков решается за счёт использования объектов межпотоковой синхронизации. Чтобы исключить ошибки в логике, для захвата объекта синхронизации и разыменования ссылки используется единый оператор (вызов функции).

Подход к реализации

Концепция безопасной работы с памятью была перенесена в 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 с минимальными изменениями.