Rust est-il vraiment sûr ?
C++ est-il vraiment si peu sûr ?
Je suis tombé sur une présentation YouTube sur un sujet intéressant, alors je la partage.
Si l’on traduit le titre, la nuance serait quelque chose comme : « dire qu’il suffit d’utiliser un langage à sûreté mémoire n’est pas un problème aussi simple ».
L’intervenant expose son point de vue depuis une position relativement équilibrée, sans pencher d’un seul côté.
- Rust empêche l’exécution de code non sûr pour la mémoire via les paniques, mais
unsafe Rustpeut contourner ces mécanismes de protection. - Cependant,
unsafe Rustnécessite un opt-in explicite, ce qui le rend plus visible qu’en C/C++ non sûr. Cette partie peut donc être examinée de façon ciblée. - Environ 30 % des crates Rust utilisent du code non sûr, et cette proportion est deux fois plus élevée dans les systèmes embarqués.
- Les sanitizers (outils d’analyse dynamique) peuvent détecter les erreurs mémoire aussi bien dans le code Rust que dans le code C/C++.
- 70 % des développeurs Rust appellent du code non sûr via des FFI (interfaces de fonctions externes) vers des bibliothèques C/C++.
- De nombreuses bibliothèques importantes, y compris dans des projets Rust, sont écrites en C/C++ (
SQLite, bibliothèquesOPCUA). - Les sanitizers peuvent analyser à la fois le code Rust et le code C/C++ au niveau de la couche LLVM IR, à condition d’avoir accès au code source.
- Miri est un outil complémentaire destiné à détecter les comportements indéfinis de Rust au niveau de la représentation intermédiaire.
- Avantages de Miri : il fournit des erreurs claires et vérifie tous les comportements indéfinis en même temps. Limites : il ne peut pas interpréter du code C/C++.
- Environ 20 % des fonctions de la bibliothèque standard Rust utilisent du code non sûr.
- Les infrastructures critiques ont besoin non seulement d’un code sûr pour la mémoire, mais aussi d’un code correct afin d’éviter les dommages matériels ou les menaces pour la vie humaine.
- Même un programme Rust sûr peut mal fonctionner ou être vulnérable à des attaques par déni de service.
- Les tests basés sur les propriétés peuvent être utiles en générant des entrées aléatoires pour trouver des cas limites, mais ils ont du mal avec les erreurs impossibles.
- Kani est un model checker qui utilise les mathématiques pour vérifier la correction d’un programme dans un ensemble de contraintes.
- Avantages de Kani : il évalue mathématiquement toutes les entrées dans les contraintes données. Limites : les boucles doivent être déroulées, et il ne prend pas en charge la concurrence ni les FFI C/C++.
- Conclusion sur Rust : Rust est sûr, mais pas autant qu’on pourrait le penser.
- Bjarne Stroustrup distingue C et C++, et souligne que C++ a été conçu pour permettre un code plus sûr.
- Les C++ Core Guidelines proposent des profils pour la sûreté des types, des bornes et des durées de vie, ce qui rapproche C++ des garanties de Rust.
- Le plus grand problème de C++, c’est qu’il est trop facile d’y écrire du code non sûr par défaut. Ce n’est pas que les développeurs ne font pas d’efforts.
Aucun commentaire pour le moment.