Назад к обновлениям
New releaseSep 17, 2026

fil-c v0.685

Fil-C: полностью совместимая безопасность памяти для C и C++

Поделиться

Fil-C 0.684

Fil-C — это фанатично совместимая реализация C и C++ с безопасной памятью. Множество программ компилируются и работают с Fil-C без изменений или с минимальными изменениями. Все ошибки безопасности памяти перехватываются как паники Fil-C. Fil-C достигает этого за счёт комбинации конкурентной сборки мусора и невидимых возможностей (каждый указатель в памяти имеет соответствующую возможность, невидимую для адресного пространства C). Каждая фундаментальная операция C (как она представлена в LLVM IR) проверяется на соответствие возможности. В Fil-C нет оператора unsafe и лишь ограниченный FFI к небезопасному коду.

Fil-C особенный, потому что:

  • Fil-C достигает полной безопасности без лазеек. В Fil-C нет ключевого слова unsafe, которое можно было бы использовать для отключения защит. Связывание с небезопасным кодом severely restricted.

  • Подход Fil-C на основе возможностей обеспечивает уровень безопасности, аналогичный аппаратным возможностям, таким как CHERI, за исключением того, что он работает на обычном оборудовании (X86_64 или ARM64).

  • Fil-C спроектирован так, чтобы предотвращать использование ошибок безопасности памяти для эксплуатации, а не просто достаточно часто их помечать для обнаружения багов. Это отличает Fil-C от AddressSanitizer, HWAsan или MTE, которые все могут быть обойдены атакующими. Ключевое отличие, делающее это возможным, заключается в том, что Fil-C основан на возможностях (так что каждый указатель знает, к какому диапазону памяти он может обращаться и как он может это делать), а не на тегах (где доступы по указателям разрешены, если они попадают в валидную память).

  • С точки зрения пользователя языка, Fil-C — это просто C и C++ с расширениями GCC/clang. Скорее всего, ваша любимая программа или библиотека на C или C++ скомпилируется в Fil-C без изменений. Компилятор Fil-C основан на clang 20.1.8, поэтому он поддерживает C17 и C++20.

Лицензия

Компилятор (clang + LLVM) покрывается LLVM-LICENSE.txt. Runtime покрывается PAS-LICENSE.txt (см. libpas/LICENSE.txt в исходном дистрибутиве). В случае классического дистрибутива Fil-C на основе musl, musl libc покрывается MUSL-LICENSE.txt (см. projects/yolomusl/COPYRIGHT и projects/usermusl/COPYRIGHT в исходном дистрибутиве). В случае дистрибутива /opt/fil, glibc покрывается glibc-LICENSE.txt, а все остальные включённые программы покрываются соответствующими файлами -LICENSE.txt. Библиотеки C++ (libc++/libc++abi) покрываются LLVM-LICENSE.txt.

Вы можете получить исходный код компилятора, runtime, libc++/libc++abi, libc (musl и glibc) и всех включённых программ с github. Исходный дистрибутив также включает множество дополнительных программ, портированных на Fil-C в директориях projects/ и pizlix/, и они имеют различные лицензии. Дистрибутив /opt/fil включает сборки множества дополнительных программ, и их лицензии находятся в additional-licenses/ в этом дистрибутиве.

Требования

Fil-C работает только на Linux/X86_64 или Linux/ARM64.

Предыдущие версии работали на Darwin/ARM64 и FreeBSD, но теперь я сосредоточен только на Linux, потому что это позволяет мне более точно реализовать libc. Ничто принципиально не мешает Fil-C работать на других архитектурах или ОС, кроме Linux.

Начало работы

Если вы скачали бинарники Fil-C, запустите:

./setup.sh

Это имеет разный эффект в зависимости от выбранного бинарного дистрибутива:

  • В случае классического дистрибутива на основе musl (filc-0.684-linux-x86_64.tar.xz или filc-0.684-linux-aarch64.tar.xz), это настраивает Fil-C для работы в текущей директории.

  • В случае дистрибутива /opt/fil на основе glibc (optfil-0.684-linux-x86_64.tar.xz), это настраивает Fil-C в /opt/fil.

Если вы скачали исходный код Fil-C, запустите:

./build_all_fast.sh

После этого вы сможете использовать Fil-C из этой директории.

Бинарный дистрибутив Fil-C поставляется с musl в качестве libc. Использование ./build_all_fast.sh в исходном дистрибутиве также собирает Fil-C с musl. Если вы используете исходный код, вы также можете:

  • ./build_all_fast_glibc.sh — собирает аналогичную конфигурацию, но с glibc 2.40 в качестве libc.

  • ./build_all.sh — полная сборка на основе musl (также собирает множество программ, портированных на Fil-C).

  • ./build_all_glibc.sh — полная сборка на основе glibc (собирает ещё больше программ, портированных на Fil-C).

  • cd pizlix && sudo ./build.sh — собирает дистрибутив Linux Pizlix.

  • cd optfil && sudo ./build.sh — собирает дистрибутив /opt/fil.

Что работает

Множество программных пакетов работают в Fil-C без изменений или с минимальными изменениями, включая крупные, такие как openssl, CPython, SQLite и многие другие. Fil-C достаточно мощный, чтобы поддерживать полностью безопасный по памяти пользовательский ландшафт Linux.

Fil-C имеет полную поддержку C и C++ плюс почти все расширения, поддерживаемые clang 20. Например, Fil-C имеет отличную поддержку атомиков и SIMD-интринсиков.

Fil-C перехватывает всё то, что делает безопасность памяти в C сложной, например:

  • Выход за границы в куче или стеке.

  • Use-after-free (также в куче или стеке).

  • Путаница типов между указателями и не-указателями.

  • Ошибки типов, возникающие при связывании.

  • Ошибки типов, возникающие из-за неправильного использования va_list.

  • Гонки указателей.

  • Системные вызовы. Все буферы, передаваемые системным вызовам, проверяются на границы и тип.

  • Множество другого.

Fil-C поставляется с достаточно полным POSIX libc и даже поддерживает такие сложные возможности, как потоки, обработка сигналов, mmap/munmap, longjmp/setjmp и исключения C++.

Узнать больше

Вы можете узнать больше о Fil-C, посетив веб-сайт.

Вы также можете написать мне: [email protected]

Подписывайтесь на меня в Twitter.

Сообщайте о проблемах на GH.

Категории