cpp-cross-platform-engineering
Разрабатывать, отлаживать и собирать C++17/20 библиотеки, CLI и системные утилиты с RAII, CMake, диагностикой памяти и проверкой целевых платформ. Не применять к задачам без C++.
SKILL.mdskills/cpp-cross-platform-engineering/SKILL.md
GitHubC++ и переносимая сборка
Исходный контракт
Найди стандарт проекта, 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 — явный пробел, не зелёный результат. Проверь пустые/граничные входы, ошибки системных вызовов, очистку ресурсов и отмену. Для пакета проверь установку и запуск из чистого окружения.
В финале укажи команды, компилятор, стандарт, проверенные платформы и непроверенные архитектуры. Публикация пакета и подпись выполняются только в рамках разрешённой задачи.