
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 キーワードがありません。安全でないコードへのリンクは厳しく制限されています。
Fil-C のケイパビリティベースのアプローチは、CHERI のようなハードウェアケイパビリティと同様のレベルの安全性を実現しますが、既製のハードウェア(X86_64 または ARM64)で動作する点が異なります。
Fil-C は、メモリ安全性バグを単にバグを見つけるのに十分な頻度でフラグを立てるのではなく、悪用に使用されるのを防ぐように設計されています。これにより、Fil-C は AddressSanitizer、HWAsan、または MTE とは異なります。これらはすべて攻撃者によってバイパスされる可能性があります。これを可能にする重要な違いは、Fil-C がタグベース(ポインタアクセスが有効なメモリにヒットした場合に許可される)ではなくケイパビリティベース(各ポインタがアクセスできるメモリの範囲とアクセス方法を認識している)であることです。
言語ユーザーの観点から見ると、Fil-C は GCC/clang 拡張機能を備えた単なる C および C++ です。お気に入りの C または C++ プログラムやライブラリが Fil-C でゼロ変更でコンパイルされる可能性が高いです。Fil-C コンパイラは clang 20.1.8 に基づいているため、C17 および C++20 をサポートしています。
コンパイラ(clang + LLVM)は LLVM-LICENSE.txt によってカバーされています。ランタイムは PAS-LICENSE.txt によってカバーされています(ソース配布の libpas/LICENSE.txt を参照)。クラシックな musl ベースの Fil-C 配布の場合、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 によってカバーされています。
コンパイラ、ランタイム、libc++/libc++abi、libc(musl および glibc)、およびすべての含まれるプログラムのソースは github から取得できます。ソース配布には、projects/ および pizlix/ ディレクトリで Fil-C に移植された多くの追加プログラムも含まれており、それらはさまざまなライセンスを持っています。/opt/fil 配布には、さまざまな追加プログラムのビルドが含まれており、それらのライセンスはその配布の additional-licenses/ にあります。
Fil-C は Linux/X86_64 または Linux/ARM64 でのみ動作します。
以前のバージョンは Darwin/ARM64 および FreeBSD で動作していましたが、現在は libc の実装をより忠実に行うことができるため、Linux のみに焦点を当てています。Linux 以外のアーキテクチャや OS で Fil-C が動作することを根本的に妨げるものは何もありません。
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 のバイナリ配布には、libc として musl が付属しています。ソース配布で ./build_all_fast.sh を使用すると、musl を使用して Fil-C もビルドされます。ソースを使用している場合は、次のこともできます:
./build_all_fast_glibc.sh - 同様のセットアップをビルドしますが、libc として glibc 2.40 を使用します。
./build_all.sh - 完全な musl ベースのビルド(Fil-C に移植された多くのソフトウェアもビルドします)。
./build_all_glibc.sh - 完全な glibc ベースのビルド(Fil-C に移植されたさらに多くのソフトウェアをビルドします)。
cd pizlix && sudo ./build.sh - Pizlix Linux ディストリビューションをビルドします。
cd optfil && sudo ./build.sh - /opt/fil 配布をビルドします。
openssl、CPython、SQLite、およびその他多数のような大規模なものを含め、多くのソフトウェアパッケージが Fil-C でゼロまたは最小限の変更で動作します。Fil-C は完全にメモリ安全な Linux ユーザーランドをサポートするのに十分な強力さを持っています。
Fil-C は C および C++ を完全にサポートし、clang 20 がサポートするほとんどすべての拡張機能もサポートしています。たとえば、Fil-C はアトミックおよび SIMD イントリンシックを優れた形でサポートしています。
Fil-C は、C におけるメモリ安全性を困難にするすべてのものを捕捉します:
ヒープまたはスタック上の境界外。
解放後使用(これもヒープまたはスタック)。
ポインタと非ポインタ間の型混同。
リンクから生じる型エラー。
va_lists の誤用から生じる型エラー。
ポインタ競合。
システムコール。システムコールに渡されるすべてのバッファは、境界と型についてチェックされます。
その他多くのもの。
Fil-C には、かなり完全な POSIX libc が付属しており、スレッド、シグナル処理、mmap/munmap、longjmp/setjmp、C++ 例外などのトリッキーな機能もサポートしています。
Fil-C の詳細については、ウェブサイトを訪問して学ぶことができます。
私にメールすることもできます: [email protected]
Twitter でフォローしてください。
問題は GH で報告してください。