cpp-cross-platform-engineering

Разрабатывать, отлаживать и собирать C++17/20 библиотеки, CLI и системные утилиты с RAII, CMake, диагностикой памяти и проверкой целевых платформ. Не применять к задачам без C++.

SKILL.md

GitHub

C++ и переносимая сборка

Исходный контракт

Найди стандарт проекта, compiler/toolchain, поддерживаемые ОС/архитектуры, build presets, тесты, ABI и способ распространения. Сохраняй существующий стек. Не переходи на новый стандарт, компилятор или систему сборки без причины, связанной с задачей.

Владение и ошибки

По умолчанию предпочитай значения и RAII. Для динамического владения используй unique_ptr; shared_ptr — только при реальном совместном владении, с контролем циклов. Невладеющие ссылки, span и указатели на границах C API требуют явно описанного времени жизни и не должны случайно становиться владельцами. Учитывай более строгие пользовательские правила использования указателей.

Документируй гарантии при ошибках; деструкторы не должны выпускать исключения. Не пропускай исключения через C ABI. Проверяй переполнение, narrowing, размеры буферов, signed/unsigned и неопределённое поведение. Для системных handles используй отдельные RAII-обёртки с корректным освобождением.

Сборка и платформы

В CMake предпочитай свойства целей, явные зависимости и out-of-source build. Не задавай глобальные флаги, которые ломают потребителей библиотеки. Проверяй install/export, когда библиотека распространяется. Для разных ОС изолируй пути, кодировки, сокеты, сигналы и handles в адаптерах. Компиляция на macOS не доказывает работу Windows/Linux; кросс-компиляция не доказывает runtime-поведение.

Конкурентность и измерения

Определи владельца каждого изменяемого состояния, порядок блокировок и условия остановки. Используй jthread/stop_token, когда стандарт и проект позволяют; иначе обеспечь явные join и отмену. Не называй структуру lock-free без доказательства требуемых гарантий. Оптимизируй только после профилирования на релевантной нагрузке.

Проверка и выпуск

По риску запускай build, CTest/тесты проекта, предупреждения компилятора, ASan/UBSan и отдельно TSan, где инструмент поддерживается. Недоступный sanitizer — явный пробел, не зелёный результат. Проверь пустые/граничные входы, ошибки системных вызовов, очистку ресурсов и отмену. Для пакета проверь установку и запуск из чистого окружения.

В финале укажи команды, компилятор, стандарт, проверенные платформы и непроверенные архитектуры. Публикация пакета и подпись выполняются только в рамках разрешённой задачи.