
fil-c v0.685
Fil-C: CおよびC++向けの完全互換メモリ安全性
Fil-C 0.686
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.686-linux-x86_64.tar.xzまたはfilc-0.686-linux-aarch64.tar.xz)の場合、Fil-Cを現在のディレクトリで実行するように設定します。 -
/opt/fil glibcベースの配布(
optfil-0.686-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_listの誤用から生じる型エラー。
-
ポインタ競合。
-
システムコール。システムコールに渡されるすべてのバッファは境界と型についてチェックされます。
-
その他多くのもの。
Fil-Cにはかなり完全なPOSIX libcが付属しており、スレッド、シグナル処理、mmap/munmap、longjmp/setjmp、C++例外などのトリッキーな機能もサポートしています。
詳細を知る
Fil-Cについて詳しくは、ウェブサイトを訪問してください。
私にメールすることもできます:[email protected]
Twitterでフォローしてください。
問題はGHで報告してください。