Fil-C 0.682 — memory safety без переписывания

good-penguin.png

Состоялся выпуск Fil-C 0.682 — компилятора C и C++, обеспечивающего полную безопасность работы с памятью (memory safety) и дающего гарантии бОльшие, чем многие другие языки, такие как, например, Rust. Проект разрабатывается Филипом Пизло (Filip Pizlo), который в представлениях не нуждается.

Fil-C базируется на кодовой базе Clang/LLVM 20.x и позволяет компилировать традиционный код на C/C++ с гарантией предотвращения всех основных уязвимостей (out-of-bounds access, use-after-free, double free, type confusion). В отличие от ASan или MTE, Fil-C использует строго безопасную объектную модель и принципиально не содержит лазеек вроде блоков unsafe.

За прошедший год проект прошёл путь от концептуального доказательства возможностей до полноценного инструментария с масштабной экосистемой.

Основные особенности и технические детали:

  • InvisiCaps 2.0 и развитие модели Capability: Существенно переработана система полномочий (capabilities), отслеживающих границы и типы указателей без изменения их 64-битного размера в адресном пространстве C. Оптимизировано хранение capability, снижены накладные расходы, а также добавлена корректная поддержка union, memcpy, атомарных операций со структурами и передачи мандатов через инлайн-ассемблер.
  • Параллельный сборщик мусора (FUGC): В рантайм-сборщик мусора Fil«s Unbelievable Garbage Collector добавлены параллельная сборка, поддержка сложных объектов вроде замыканий и GNU Indirect Function.
  • Поддержка ARM64: Практически с нуля реализован бэкенд, рантайм, загрузчик и ABI для архитектуры ARM64 (Linux/aarch64), проект перешел в фазу бета-тестирования на этой платформе.
  • Безопасный инлайн-ассемблер и SIMD: Добавлена уникальная возможность выполнения безопасных ассемблерных вставок (включая ассемблерные блоки OpenSSL) с сохранением проверки полномочий. Реализована полная поддержка векторных инструкций SSE, AVX, AVX2 и AVX512 (включая masked load/store, expand/compress, sfence и prefetch).
  • Escape Analysis: Начиная с версии 0.671 внедрен статический анализ утечек памяти из областей стека. Это стало самым крупным оптимизационным изменением за год: скорость выполнения QuickJS выросла более чем в 6 раз, а большинства остальных программ — более чем на 10%.
  • Совместимость с C++ и современными стандартами: Реализована поддержка исключений C++, принудительного развертывания стека, ucontext, вычисляемых переходов, std::optional и указателей на члены классов.
  • Защита от опасных UB-оптимизаций LLVM: Fil-C фактически отключил агрессивные оптимизации LLVM, полагающиеся на Undefined Behavior (UB). В частности, принудительно отключен strict aliasing и включен аналог -fwrapv, что предотвращает некорректное удаление проверок безопасности компилятором.
  • Переход на LLVM/Clang 20: Компилятор переведен на кодовую базу Clang 20 (c версии Fil-C 0.670), что обеспечило лучшую совместимость и переносимость кодогенерации.
  • Расширение Linux ABI и FFI нового поколения: Реализована эмуляция и безопасные обертки для десятков системных вызовов Linux (statx, openat2, pidfd, epoll, splice, futex, timer API и др.), а также поддержка dlopen, dlvsym, libffi и FFI-слоя для взаимодействия с внешним кодом.
  • Новая конвенция вызовов и API рантайма: Оптимизирован внутренний ABI вызова функций для снижения оверхеда. Добавлены новые API, включая zlock_runtime_threads() (фиксация потоков для построения строгих песочниц), а также встроенный sampling profiler и инструменты дампов памяти.
  • Полноценный userspace-дистрибутив /opt/fil: безопасное системное окружение на базе glibc 2.40, включающее OpenSSH, OpenSSL, sudo, git, curl, wget, rsync, tmux, make, grep, а также системные библиотеки (PAM, Kerberos, SELinux, ICU).

Готовые бинарные сборки распространяются в двух вариантах: автономном на базе musl (filc) и полном системном окружении /opt/fil для архитектур x86_64 и ARM64.

GitHub проекта

Также отметим, что имеется и безопасный по памяти дистрибутив Linux — Pizlix

>>> Сайт проекта

©  Linux.org.ru