Retour aux mises à jour
New releaseSep 17, 2026

fil-c v0.685

Fil-C : sécurité mémoire entièrement compatible pour C et C++

Partager

Fil-C 0.684

Fil-C est une implémentation de C et C++ à sûreté mémoire, fanatiquement compatible. De nombreux logiciels se compilent et s'exécutent avec Fil-C sans aucun changement ou avec des changements minimes. Toutes les erreurs de sûreté mémoire sont détectées sous forme de paniques Fil-C. Fil-C y parvient en combinant un ramasse-miettes concurrent et des capacités invisibles (chaque pointeur en mémoire possède une capacité correspondante, non visible depuis l'espace d'adressage C). Chaque opération C fondamentale (telle qu'observée dans le LLVM IR) est vérifiée par rapport à la capacité. Fil-C n'a pas d'instruction unsafe et ne dispose que d'une FFI limitée vers du code non sûr.

Fil-C est particulier car :

  • Fil-C atteint une sûreté complète sans aucune échappatoire. Il n'existe pas de mot-clé unsafe en Fil-C qui pourrait être utilisé pour désactiver les protections. La liaison avec du code non sûr est sévèrement restreinte.

  • L'approche basée sur les capacités de Fil-C atteint un niveau de sûreté similaire à celui des capacités matérielles comme CHERI, sauf qu'elle fonctionne sur du matériel standard (X86_64 ou ARM64).

  • Fil-C est conçu pour empêcher que les bugs de sûreté mémoire soient exploités, plutôt que de simplement les signaler suffisamment souvent pour trouver des bugs. Cela distingue Fil-C d'AddressSanitizer, HWAsan ou MTE, qui peuvent tous être contournés par des attaquants. La différence clé qui rend cela possible est que Fil-C est basé sur les capacités (ainsi chaque pointeur sait quelle plage de mémoire il peut accéder, et comment il peut y accéder) plutôt que sur les tags (où les accès par pointeur sont autorisés s'ils atteignent une mémoire valide).

  • Du point de vue de l'utilisateur du langage, Fil-C n'est que du C et du C++ avec les extensions GCC/clang. Il est plus probable que non que votre programme ou bibliothèque C ou C++ préféré se compile en Fil-C sans aucun changement. Le compilateur Fil-C est basé sur clang 20.1.8, il prend donc en charge C17 et C++20.

Licence

Le compilateur (clang + LLVM) est couvert par LLVM-LICENSE.txt. Le runtime est couvert par PAS-LICENSE.txt (voir libpas/LICENSE.txt dans la distribution source). Dans le cas de la distribution Fil-C classique basée sur musl, la libc musl est couverte par MUSL-LICENSE.txt (voir projects/yolomusl/COPYRIGHT et projects/usermusl/COPYRIGHT dans la distribution source). Dans le cas de la distribution /opt/fil, glibc est couverte par glibc-LICENSE.txt, et tous les autres programmes inclus sont couverts par les fichiers -LICENSE.txt respectifs. Les bibliothèques C++ (libc++/libc++abi) sont couvertes par LLVM-LICENSE.txt.

Vous pouvez récupérer les sources du compilateur, du runtime, de libc++/libc++abi, de la libc (musl et glibc) et de tous les programmes inclus depuis github. La distribution source inclut également de nombreux programmes supplémentaires qui ont été portés vers Fil-C dans les répertoires projects/ et pizlix/, et ils ont diverses licences. La distribution /opt/fil inclut des builds de divers programmes supplémentaires et leurs licences se trouvent dans additional-licenses/ dans cette distribution.

Prérequis

Fil-C ne fonctionne que sur Linux/X86_64 ou Linux/ARM64.

Les versions précédentes fonctionnaient sur Darwin/ARM64 et FreeBSD, mais je me concentre désormais uniquement sur Linux car cela me permet de réaliser un travail plus fidèle d'implémentation de la libc. Rien n'empêche fondamentalement Fil-C de fonctionner sur d'autres architectures ou OS que Linux.

Pour commencer

Si vous avez téléchargé les binaires Fil-C, exécutez :

./setup.sh

Cela a un effet différent selon la distribution binaire que vous avez choisie :

  • Dans le cas de la distribution classique basée sur musl (filc-0.684-linux-x86_64.tar.xz ou filc-0.684-linux-aarch64.tar.xz), cela configure Fil-C pour s'exécuter dans le répertoire courant.

  • Dans le cas de la distribution /opt/fil basée sur glibc (optfil-0.684-linux-x86_64.tar.xz), cela configure Fil-C dans /opt/fil.

Si vous avez téléchargé les sources de Fil-C, exécutez :

./build_all_fast.sh

Vous pourrez alors utiliser Fil-C depuis ce répertoire.

La distribution binaire de Fil-C est fournie avec musl comme libc. L'utilisation de ./build_all_fast.sh dans la distribution source compile également Fil-C avec musl. Si vous utilisez les sources, vous pouvez aussi :

  • ./build_all_fast_glibc.sh - compile une configuration similaire mais avec glibc 2.40 comme libc.

  • ./build_all.sh - compilation complète basée sur musl (compile aussi de nombreux logiciels portés vers Fil-C).

  • ./build_all_glibc.sh - compilation complète basée sur glibc (compile encore plus de logiciels portés vers Fil-C).

  • cd pizlix && sudo ./build.sh - compile la distribution Linux Pizlix.

  • cd optfil && sudo ./build.sh - compile la distribution /opt/fil.

Ce qui fonctionne

De nombreux paquets logiciels fonctionnent en Fil-C sans aucun changement ou avec des changements minimes, y compris de gros comme openssl, CPython, SQLite, et bien d'autres. Fil-C est suffisamment puissant pour prendre en charge un environnement utilisateur Linux entièrement sûr en mémoire.

Fil-C prend entièrement en charge C et C++ ainsi que presque toutes les extensions prises en charge par clang 20. Fil-C offre par exemple un excellent support des atomiques et des intrinsèques SIMD.

Fil-C détecte tout ce qui rend la sûreté mémoire en C difficile, comme :

  • Les dépassements de bornes sur le tas ou la pile.

  • Les use-after-free (également sur le tas ou la pile).

  • La confusion de type entre pointeurs et non-pointeurs.

  • Les erreurs de type résultant de l'édition de liens.

  • Les erreurs de type résultant d'un mauvais usage des va_lists.

  • Les races de pointeurs.

  • Les appels système. Tous les tampons passés aux appels système sont vérifiés en termes de bornes et de type.

  • Beaucoup d'autres choses.

Fil-C est fourni avec une libc POSIX raisonnablement complète et prend même en charge des fonctionnalités délicates comme les threads, la gestion des signaux, mmap/munmap, longjmp/setjmp et les exceptions C++.

En savoir plus

Vous pouvez en apprendre davantage sur Fil-C en visitant le site web.

Vous pouvez aussi m'envoyer un e-mail : [email protected]

Suivez-moi sur Twitter.

Signalez les problèmes sur GH.

Catégories