Connexion
Abonnez-vous

Retour sur 10 ans de Rust, un langage devenu incontournable

Mon Rust est un peu rouillé

Retour sur 10 ans de Rust, un langage devenu incontournable

Rust fête les 10 ans de sa version stable et presque les 20 ans depuis le début du projet. Le langage de programmation s’est fait une place de choix, jusque dans les noyaux de Linux et Windows. La Rust Foundation publie pour l’occasion un long billet de blog de son créateur.

Le 16 mai à 16h35

C’est le 15 mai 2015 que la première version stable du langage Rust a été mise en ligne, la 1.0 tout simplement. Mais les premiers pas de Rust sont encore bien plus vieux et remontent en 2006, soit il y a presque 20 ans. Pour rappel, Technology Review a déjà raconté l’histoire des premières années de Rust.

Entre la version 1.0 de 2015 et celle d’aujourd’hui, Rust a gagné ses lettres de noblesse dans le petit monde des langages de programmation. Il s’est frayé depuis des années un chemin dans le noyau de Windows, ainsi que celui de Linux, non sans faire froncer quelques sourcils entre les promoteurs du Rust et mainteneurs habitués au C.

Un projet personnel en 2006, changement de braquet en 2009

C’était à la base un projet personnel de Graydon Hoare quand il était développeur chez Mozilla. Entre 2006 et 2009, Rust « générait un code extrêmement lent qui ne fonctionnait que sur 3 plateformes seulement (toutes x86 32 bits, donc en réalité une seule) ».

Il reste 81% de l'article à découvrir.

Déjà abonné ? Se connecter

Cadenas en colère - Contenu premium

Soutenez un journalisme indépendant,
libre de ton, sans pub et sans reproche.

Accédez en illimité aux articles

Profitez d'un média expert et unique

Intégrez la communauté et prenez part aux débats

Partagez des articles premium à vos contacts

Abonnez-vous

Commentaires (33)

votre avatar
ça me fais toujours rire de mesurer les perf d'un dépôt ou dev au nombre de modifications effectués; à titre d'exemple je connais un dev qui push chaque fichier indépendamment donc fait une dizaine de commit par jour c'est imbattable sur cette métrique mais ça ne veut juste rien dire et c'est illisible heureusement qu'il y a les branches dans les dépôts car sinon vas y pour vérifier une fonctionnalité avec des centaines de commit.
D'autre dev commit uniquement quand ils ont codé et testé la fonctionnalité donc vont faire un commit par semaine peut être.
votre avatar
"Incontournable", il ne faut peut-être pas exagérer. Je fais du développement tous les jours sans passer par Rust, et bon, ça va, je suis toujours vivant (et mes logiciels toujours stables)…
votre avatar
"incontournable" dans le sens où tout le monde sait que c'est Rust. Pas dans le sens "tout le monde l'utilise".
votre avatar
Malheureusement, à l'exception de son système de gestion de la mémoire, Rust n'est pas vraiment un progrès par rapport aux langages de programmation précédents. Pour être un langage réellement sûr, il aurait fallu qu'il soit conçu pour éliminer toutes les catégories de défauts qui peuvent mener à des vulnérabilités, pas seulement celle des erreurs de gestion de mémoire. C'est un peu déprimant de savoir qu'il faudra peut-être encore 10 ou 20 ans pour qu'un langage qui corrige d'autres erreurs de conception apparaisse et commence à s'imposer.
votre avatar
Les erreurs de sécurité mémoire comptent en général pour les deux tiers des vulnérabilités critiques dans la plupart des logiciels C et C++ non triviaux. Donc si, Rust apporte, de base, un gros progrès pour la sécurité des logiciels qui ont besoin d'une maîtrise du bas niveau.
Ceci dit Rust fait aussi des effort pour aller au delà de la simple sécurité mémoire, en évitant par défaut, autant que possible tous les comportements risqués. Par exemple, dans sa bibliothèques standard, l'utf-8 est validé et les hash utilisent par défaut des algorithmes crypographiquement sûrs, ...

Empêcher absolument tous les défauts qui peuvent mener a des vulnérabilités, c'est juste impossible, vu que leur liste ne peut pas être exhaustive. Un langage ne peut juste rien faire si l'implémentation logique est fausse. La plupart des autres type courants de failles ne se traitent d'ailleurs pas au niveau du langage mais, par exemple, au niveau du framework web (XSS, ...) ou des bibliothèques de sécurité (authentification, cryptographie, ...)

La sécurité ça ne marche pas en mode tout ou rien : faire disparaître totalement des classes de bug graves et courants, ça reste une amélioration excellente.
votre avatar
Ce que je voulais dire, c'est que Rust est loin de faire tout ce qu'un langage de programmation peut faire pour éliminer les failles de sécurité et autres bogues. C'est dommage, parce qu'on a besoin d'un tel langage pour que peut-être un jour les logiciels en général atteignent un niveau de qualité satisfaisant, c'est à dire qu'ils n'aient pas de failles de sécurité et qu'ils aient peu ou pas de bogues. Rust est indéniablement un progrès, mais la route est encore longue.
votre avatar
Les langages basé sur la preuve formelle vont en ce sens. Mais c'est souvent complexe à mettre en oeuvre et ça demande beaucoup de puissance de calculs. En ce ce sens, tu t'en sers pour les choses très critiques (e.g., sécurité des personnes, cryptographie...).

Ensuite, il se pose une autre question qui est de l’exécution. Tu as un langage safe, cool. Mais est-ce que ton processeur sera safe à l'execution ?

Rust en ce sens apporte une possibilité de se protéger d'un certains nombres de vulnérabilités en ayant trouvé un compromis entre temps de compilation et "preuve que c'est safe".
votre avatar
La réputation de ce langage souffre de la toxicité de sa communauté.
votre avatar
Il [G. Hoare] définit Rust comme un outil « permettant de construire d’autres infrastructures : protocoles réseau, serveurs web, équilibreurs de charge, systèmes de télémétrie, bases de données, codecs, cryptographie, systèmes de fichiers, systèmes d’exploitation, machines virtuelles, interpréteurs, etc., etc. ».

En cryptographie Rust sera très dangereux à utiliser car il ne peut garantir l’exécution en temps constant des instructions processeurs.

Je comprends que son auteur veut le voir partout, mais Rust ne vise qu'une niche d'application. Et la preuve en 10 ans d'existence Rust est nettement moins répandu que Python ne l'a été. Non pas qu'il est inutile, mais qu'ils visent une niche, qui représente des cas d'usages assez spécifique.
votre avatar
Plutôt d'accord avec toi.

Je rajouterai des éléments qui font que, pour moi, Rust restera un langage assez cloisonné dans ses usages.

Déjà, la syntaxe. On a beau avoir de l'expérience et connaitre plus ou moins un certain nombre de langage, il est très difficile de lire et comprendre un tant soit peu du code Rust sans aucune connaissance du langage. Et ce n'est pas un langage facile. Il vient avec de nombreuses "contraintes" qui sont le pendant de la sécurité de la gestion de la mémoire. Tous les développeurs ne sont pas près à faire ça. Il suffit de voir encore tous ceux qui préfèrent faire du javascript au lieu du typescript !! (purtant, la marche technique me semble beaucoup moins haute)

De plus, il existe déjà des langages beaucoup plus sûr que le C, mais sans avoir le même modèle que le Rust. Je pense à l'Ada notamment. Pourtant, l'Ada n'a pas percé non plus, sauf dans des zones de niches. Et ça fait plus de 40 qu'il existe et qu'il évolue ! (Ada83, Ada95, Ada2005, Ada2012 et Ada2023)

Ensuite, et là c'est un avis strictement personnel, j'ai trouvé que l'API manquait un peu de cohérence et de clarté. Et avec cargo, on peut vite se retrouver avec le syndrome NPM : 1 dépendance en rajoute 50.

Enfin, je n'ai rien contre Rust pour de nouveaux projets. Mais inclure Rust dans des projets déjà existant comme le noyau Linux, c'est le meilleur moyen, à mon sens, de créer des problèmes. L'homogénéité au sein d'un projet, notamment un projet de cet envergure, devrait être la priorité. Le débogage pourra être extrêmement pénible, car il faudra à la fois avoir des connaissance sur le fonctionnement du noyau, en C et en Rust (et des connaissances plus ou moins poussées). L'attrait pour de nouveaux contributeur pourrait aussi en pâtir, tant la marche technique peut sembler élevée pour contribuer.
votre avatar
En face avec toi sur tout ces points

Sur la syntaxe je pense que c'est l'héritage de OCalm et de la programmation fonctionnelle plus que des contraintes mémoires liés aux borrow-checker.

Pour le noyaux linux, il est difficile de comprendre le choix de Linus. Certains parlent de pressions venant des GAFAMS (réduction des coûts car à terme nombres de dev Rust > nombres de dev C ou des enjeux en lien avec les licences GPL/MIT). Linus semblait parlé du fait qu'attiré de nouveaux dev en C était difficile est que Rust allait faciliter la chose.
Je suis sceptique, car au delà de C et du Rust, le dev système c'est plus une affaire d'élements très bas-niveau que d'un langage de programmation.
Mais je suis d'accord, Rust dans l'intégration du noyau risque de poser des soucis (c'est déjà le cas) car le modèle mémoire du noyau Linux n'est pas celui de Rust. (et la même logique s'applique pour tous les aspects en lien avec l'execution parallèle (threads, asynchrone, mulitprocessing...)).
A mon sens, il aurait était plus intéressant pour le noyau de faire évoluer son langage C.
Pour le Rust comme kernel, il y a le projet RedOx.
votre avatar
De mon coté, je pense que Rust à de bons atouts pour se répandre à peu près partout.

Venant du C/C++, avant d'apprendre le Rust, j'arrivais assez bien à lire le langage, au moins aussi facilement que du JavaScript ou du Python. Bien sur quand on veut comprendre vraiment comment est construit un programme (y compris le design/l'architecture), il faut apprendre le langage.

Je suis utilisateur de logiciel libre avec une démarche de contributeur. Malgré une envie de participer notamment quand je rencontrais des bugs, ou j'avais envie d'une petite fonctionnalité supplémentaire je crois que je n'ai jamais réussi à participer à des programmes en C ou C++.
Alors qu'avec Rust j'ai pu le faire sur plusieurs projets, et des projets totalement différent. Une fois une base minimum du langage appris, je trouve la charge mentale pour lire le code, le comprendre et le modifier nettement plus faible.
Contexte: j'ai plus de 13ans d'expérience professionnel en programmation C/C++ et environ 3 ans en Rust (pas à temps plein).

Je trouve le code Rust plus facile à lire, car beaucoup plus explicite. L'exemple qui me vient en premier est les pointeurs en C/C++ vs Rc, RefCell, Arc, Mutex, RwLock en Rust.
En Rust le type indique l'intension et les contraintes lié à une allocation mémoire, alors qu'en C/C++ on a juste un pointeur.

Concernant l'inclusion de Rust dans le noyau Linux, effectivement ce n'est pas simple et c'est normal que ça créé des problèmes. Mais je pense que si ça été accepté par Linus, c'est parce que les avantages sont importants.
votre avatar
"En Rust le type indique l'intension et les contraintes lié à une allocation mémoire, alors qu'en C/C++ on a juste un pointeur."

Et par curiosité, quelle version du C++ tu utilises ? Parce que je suis d'accord pour le "vieux C++". Mais ce n'est plus le cas avec le C++ moderne. Les pointeurs ne sont plus censé se trimballer seul maintenant, et surtout, sauf cas particulier, on en a rarement besoin.

Ah oui, mélanger la notion de pointeur en C avec celle du C++, c'est pas comparable. Le pointeur C et C++ sont sémantiquement la même chose, mais la manière de les utiliser à largement changer.

"L'exemple qui me vient en premier est les pointeurs en C/C++ vs Rc, RefCell, Arc, Mutex, RwLock en Rust."

C'est quoi le rapport entre un pointeur et Arc, Mutex et autres ? On mélange des choux et des carottes là, non ?
votre avatar
Effectivement on utilisait du "vieux C++", les choses ont évolué en C++. Mais pas toutes les bases de codes, tout le monde n'a pas envie de faire du C++ moderne, et n'est pas obligé.
C'est une des raisons pour laquelle je préfère Rust, il y a une contrainte de "qualité de code" supérieur.
Quand je dois utiliser du code externe (une librairie par exemple), c'est plus facile d'avoir confiance dans le code (sa qualité, sa fiabilité). Et je dirais aussi, plus facile de "vérifier" si le code est de qualité.
C'est quoi le rapport entre un pointeur et Arc, Mutex et autres ? On mélange des choux et des carottes là, non ?
Le rapport que je fais, c'est que dans les deux cas c'est le moyen d’accéder à une allocation mémoire.
Si le C++ moderne incite à ne plus utiliser directement les pointeurs, c'est encore possible, et très présent dans les bases de code historique.
En Rust (non Unsafe) il n'y a pas de pointeur, une allocation mémoire est encapsulé dans un objet qui contraint (et explicite) la façon dont on pourra accéder à la donnée (modification ou pas, multi-thread ou pas).
votre avatar
*"Effectivement on utilisait du "vieux C++", les choses ont évolué en C++. Mais pas toutes les bases de codes, tout le monde n'a pas envie de faire du C++ moderne, et n'est pas obligé.
C'est une des raisons pour laquelle je préfère Rust, il y a une contrainte de "qualité de code" supérieur."*

Mais ne pas faire de C++ moderne, sauf cas particulier, est idiot ! C'est comme utiliser de l'essence au plomb alors qu'il y a mieux.
La qualité d'un code ne dépend pas d'un langage mais du développeur. En revanche qu'on se sente plus à l'aise avec Rust ou le C++ pour faire un code de qualité, c'est plus une question de goût et de couleur.

La qualité d'un code ne présume absolument pas de sa fiabilité. Voici un bon exemple : https://github.com/RustCrypto/block-ciphers. Autant de dire qu'utiliser ce code dans autre chose qu'un projet de hobbyiste, c'est prendre des gros risques.
Pourquoi ? Car Rust ne peut pas garantir l'execution en temps constant ni l'assembleur produit.
Ce qui fait la confiance d'une libraire, ce n'est pas uniquement la qualité de son code. J'ai bien plus confiance dans BLAS que dans n'importe quelle code, quand bien même Rust garanti l'absence de bug mémoire dans son implémentation.


*"Le rapport que je fais, c'est que dans les deux cas c'est le moyen d’accéder à une allocation mémoire.
Si le C++ moderne incite à ne plus utiliser directement les pointeurs, c'est encore possible, et très présent dans les bases de code historique."*

Je reformule ma question. En quoi un Mutex est un access à la mémoire ? Sémantiquement ça ne fait pas de sens.

"En Rust (non Unsafe) il n'y a pas de pointeur, une allocation mémoire est encapsulé dans un objet qui contraint (et explicite) la façon dont on pourra accéder à la donnée (modification ou pas, multi-thread ou pas"

Oui comme en C++ avec le concept du RAII. Alors certes, on n'a pas les même garanti que Rust à la compilation, mais on les a à l'execution.

Le vieux C++ doit disparaître des codes et surtout de l'enseignement de la programmation aux nouvelles générations. Le vieux C++ est révolu et ne doit perdurer que les endroits où les MaJ d'un code n'est pas simple et sans conséquence.
votre avatar
Mais ne pas faire de C++ moderne, sauf cas particulier, est idiot ! C'est comme utiliser de l'essence au plomb alors qu'il y a mieux.
Mais ne pas faire du Rust, sauf cas particulier, est idiot ! C'est comme utiliser de l'essence au plomb alors qu'il y a mieux.
:D
La qualité d'un code ne dépend pas d'un langage mais du développeur.
Bien sûr, j'ai aussi vu du code Rust pas très jolie, et pas hyper robuste.
En revanche qu'on se sente plus à l'aise avec Rust ou le C++ pour faire un code de qualité, c'est plus une question de goût et de couleur.
Pas seulement, Rust (et sont écosystème) apporte plus d'outils pour aider à faire du code de qualité.
Mais c'est logique, c'est "le but" de Rust, et il est plus récent, il profite des expériences précédentes.
Oui comme en C++ avec le concept du RAII. Alors certes, on n'a pas les mêmes garanti que Rust à la compilation, mais on les a à l’exécution.
Et ça fait une importante différence, car à l'exécution, c'est plus compliqué à tester, et parfois difficile d'être certain que c'est bien testé.
votre avatar
"Pas seulement, Rust (et sont écosystème) apporte plus d'outils pour aider à faire du code de qualité."

Comme en C++ où il existe une multitude d'outils. Le Rust a l'avantage d'avoir compris que ce genre d'outils sont nécessaire à avoir dans un langage plus récent.

"Et ça fait une importante différence, car à l'exécution, c'est plus compliqué à tester, et parfois difficile d'être certain que c'est bien testé."

C'est bien vrai, mais un peu de nuance sur ce point. Les sécurités de Rust sur les accès mémoires sont partiels. Une vrai vérification est un problème NP-hard et là Rust aurait un temps de compilation mésosphérique. Le borrow-checker couvre les cas les plus courants et normalement, si on ne fait pas de saloperies, ça marche dans 100% des cas. Mais le système de vérification peut-être mis en échec et ça seul un test réel pourra permettre de le détecter.

Et là, il est très naturel dans un code C++ sérieux (qu'importe pro ou sérieux) d'avoir des checks mémoires forts sur la stack ou sur la heap lors des phases de dev et de tests. Est-ce plus naturel de faire tourner un valgrind avec Rust qu'avec du C++ ? Je ne sais pas pour ma part mais pour les codes Rust qui font du unsafe ou FFI, je n'ai pas souvenir d'un projet sur Github d'importance utilisant ce genre de vérifications.
votre avatar
et surtout de l'enseignement de la programmation aux nouvelles générations.
C'est pas gagné ...
votre avatar

"Oui comme en C++ avec le concept du RAII. Alors certes, on n'a pas les mêmes garanties que Rust à la compilation, mais on les a à l'exécution."

Le jeune C++ introduit std::unique_ptr, std::shared_ptr et std::weak_ptr, qui sont des pointeurs intelligents intégrés au langage standard (via la STL). Cela facilite la gestion mémoire automatique sans ramasse-miettes. C'est bien que ce soit intégré nativement dans le langage, mais en soi, ce n'est pas une révolution par rapport au vieux C++. En effet, les pointeurs intelligents de l'époque existaient déjà dans le vieux C++ via des bibliothèques à intégrer ou des implémentations maison. Ces pointeurs intelligents étaient bien enseignés. L'intégration native des pointeurs intelligents améliore le confort, mais n'efface pas les limites fondamentales du modèle, tout en masquant le fonctionnement interne et certains défauts (si vous considérez qu'il ne faut plus les enseigner).

Par exemple, les références croisées (pointeurs partagés mutuels) provoquent toujours des fuites mémoire silencieuses, sauf si l'on introduit manuellement des weak_ptr pour casser les cycles. Cela complexifie la conception, et n’est pas vérifié par le compilateur, contrairement à Rust. Une autre solution pour gérer les références croisées est d'utiliser un ramasse-miettes, ce qui permet de réaliser des programmes plus complexes tout en soulageant la charge mentale.

Rust n'a ni ramasse-miettes ni pointeurs intelligents, mais au moins il impose des contraintes fortes à la compilation, ce qui interdit par construction les cas incohérents. Il offre un modèle mémoire sûr par conception.

Le vieux C++ obligeait déjà à faire attention ; le nouveau C++ rend juste les bonnes pratiques un peu moins pénibles à appliquer. Mais la charge mentale reste, contrairement à Rust ou aux langages à ramasse-miettes.
votre avatar
Sans move-semantic (introduit en C++11), les pointeurs intelligents ne permettaient pas de transférer la propriété d’une ressource, seulement de la partager. Ça change radicalement la donne en fait.

Oui, on pouvait faire des choses avant, mais c’est tellement plus propre et plus sûr depuis C++11 qu’on peut quand même dire qu’il y a eu un gros cap de franchi.
votre avatar
Je ne trouve pas que Rust ne vise qu'une niche, au contraire il vise à être une option pertinente (mais pas la seule) dans à peut-près tous les domaines (en dehors des usages ou la compilation est un problème, type "scripting dynamique" par exemple).
Aujourd'hui, je sais qu'il prend place notamment dans les noyaux (windows, linux), en cybersécurité dans les outils de protection réseaux, dans les backend d'application web, dans des applications client (Un certain nombre d'application Gnome, le client Dropbox), dans l'embarqué, dans le jeux-vidéo (même si timidement pour l'instant), dans les applications web client (avec WASM). Donc je n'appellerais pas ça une niche.

Et sur quoi tu te bases pour dire que Rust est nettement moins répandu que Python ?
Nettement moins sur quel critère ? Le nombre de développeur ? Le nombre de programme écrit ? Le nombre de personne qui utilise des programmes écrit dans le langage ?
Et les époques sont différentes, les langages n'ont pas du tout le même objectif, donc je ne vois pas trop comment une comparaison de popularité ou d’expansion pourrais être pertinente.
votre avatar
" (en dehors des usages ou la compilation est un problème, type "scripting dynamique" par exemple)."

En dehors du HPC, de toute approche parallèle plus complexe qu'un fork-join, de la crytographie, du jeux vidéos... Rust est très bon là où la sécurité mémoire est critique (e.g, équipement réseau, pare-feu, noyau...). Mais si la sécurité mémoire n'est pas une priorité, Rust devient moins utile/interessant comme solutions.

"Et sur quoi tu te bases pour dire que Rust est nettement moins répandu que Python ?"

La faible migration de projet vers Rust (les offres en C++ sont largement supérieure à Rust en France). Le faible classement dans l'index TIOBE, et le fait que le C/C++ domine toujours depuis 10 ans alors que Rust peine encore à prendre la place.
Quand Python est arrivée, en 10 ans il a pris la place de Matlab, IDL et consort dans les milieux académiques et industrielle. Matlab est encore enseigné dans les écoles d'ingénieurs au coté de Python mais de plus en plus de prof. passe à Python. Idem pour les universités.
Quand à Rust, bah il commence à sortir le bout de son nez.

Tu parlais du Rust dans le jeu vidéo. Je ne l'ai pas vu détroner significativement le C++ dans ce domaine. En revanche, j'ai vu Python faire office d'alternative à Lua.
votre avatar
Ok pour la façon dont tu compare.
Je ne suis personnellement pas convaincu par leur pertinence pour comparer l’expension de Python et Rust.
Par exemple :
Le faible classement dans l'index TIOBE, et le fait que le C/C++ domine toujours depuis 10 ans alors que Rust peine encore à prendre la place.
Dans l'autre sens, lors des sondages Stack Overflow, Rust est souvent mis en avant. Je cite :
Pourtant, c’est Rust que les répondants admirent le plus. En effet, près de 85 % des développeurs l’ayant utilisé, ont déclaré qu’ils veulent continuer à s’en servir, contre 58 % pour JavaScript et 66 % pour Python.
Je ne pense pas qu'il serait autant plébiscité des développeurs l'ayant essayé si c'était un langage qui vise une niche (ce qui était le propos de départ).
Tu parlais du Rust dans le jeu vidéo. Je ne l'ai pas vu détrôner significativement le C++ dans ce domaine. En revanche, j'ai vu Python faire office d'alternative à Lua.
Je ne pense pas que ça soit une comparaison pertinente. C++ est utilisé pour la partie moteur, qui est d'une certaine façon la fondation technique d'un jeu, ce sur quoi s'appuie tout le reste. C'est plusieurs millions de lignes de code.
Alors que Lua et Python sont plutôt utilisés pour les parties scripting. Donc des bases de code beaucoup plus petite, et qui sont plus différentes d'un jeu à l’autre.
votre avatar
Comparer Rust SO avec TIOBE ne renseigne pas sur la même information. TIOBE fonctionne sur "Le nombre de pages web retournées par les principaux moteurs de recherche lorsqu'on leur soumet le nom du langage de programmation". Donc clairement à l'échelle du Web, on parle moins de Rust que des autres langages, pourtant personne ne nie que Rust à le vent en poupe.

Pour SO, comparer Rust, Javascript et Python me laisse dubitatif sur les questions posés. bref, ce genre de sondages a la même valeur que "80 % des sympatisants d'un parti politique sont pour Mr X à la tête du parti". Et pourtant Mr X se prendre une branlée aux élections présidentielles.

Pour le jeux vidéo, où verrais-tu l'usage de Rust ?
votre avatar
Mon propos n'était pas que le sondage StackOverflow était pertinent, mais plus que TIOBE ne l'est pas plus, en tout cas pas sur l'aspect niche ou pas, ou même sur la comparaison de la progression des langages Python et Rust à 10 ans.
Pour le jeux vidéo, où verrais-tu l'usage de Rust ?
Coté moteur il a une bonne place à jouer par exemple. Bevy-engine me semble prometteur, notamment par son architecture, ses designs techniques (sa gestion ECS avec les systems).
Mais également coté éditeur de contenu, Rust me parait très pertinent car il permet de faciliter la création et surtout la maintenance de grosses applications complexe.
Par contre il faudra du temps, justement parce que ce sont de grosses applications, avec une dépendance à tout un écosystème (librairie de GUI pour l’éditeur, physique pour les moteurs de jeux), donc il faut aussi que l'écosystème migre (par l'utilisation d'alternative), ou au minimum se rende compatible avec Rust.
Embark-studios par exemple mise beaucoup sur Rust, avec un certain nombre de projet écrit en Rust publié en opensource.
votre avatar
Pour le jeux vidéo nous verrons à l'usage. Mais on trouve bien des moteurs en Go, en C# alors pourquoi pas en Rust.
votre avatar
"En cryptographie Rust sera très dangereux à utiliser car il ne peut garantir l’exécution en temps constant des instructions processeurs."
Je ne trouve pas de sources qui confirme ce que vous dites. Je comprend que la gestion mémoire sous-jacente en Rust peut faire varier la vitesse d'exécution et donc poser des problèmes d'exécution en temps constants, là où en C, il faut expliciter la gestion dynamique de la mémoire, mais de ce que j'ai lu, il semble possible de développer des algos en temps constant en Rust, vu que les bibliothèques de CryptoRust notamment celle ci, le proposent. Sachant que de toute façon il est peu recommandé d'implémenter ses propres bibliothèques liées au chiffrement, que ce soit en Rust ou en C/C++ ou dans n'importe quel langage, il n'y a pas vraiment de moment où a besoin de faire très attention sur le temps constant dès lors qu'on utilise une bibliothèque éprouvée. Même pour comparer deux "mot de passe" ou "token", ne suffirait-il pas d'utiliser une fonction "officielle" pour le faire ?

De plus, si vous voulez développer votre propres fonction, j'ai trouvé cette bibliothèque Rust qui teste si votre exécution est bien en temps constant : https://github.com/rozbb/dudect-bencher

Avez vous un lien qui explique en quoi se serait un problème indépassable ?
votre avatar
John Kelsey, Bruce Schneier, David Wagner, and Chris Hall. Side channel cryptanalysis of product ciphers.Journal of Computer Security, 8(2-3):141–158, 2000.

21. Paul C. Kocher. Timing attacks on implementations of Diffie-Hellman, RSA, DSS, and other systems. In
Advances in Cryptology – CRYPTO 96, volume 1109 of LNCS, pages 104–113. Springer, 1996.

22. Robert Könighofer. A fast and cache-timing resistant implementation of the AES. In Tal Malkin, editor,CT-RSA, volume 4964 of Lecture Notes in Computer Science, pages 187–202. Springer, 2008.

Parmi quelques exemples en tête.


ça n'a rien à voir avec la manière dont Rust ou le C gère la mémoire à la fin tout est un pointeur (même en Rust). ça a avoir avec la conversion du Rust/C en assembleur.

Et prouver qu'un code est en temps constant ne se fait pas avec dudect-bencher. Il manque des fonctionnalités essentielles pour quelque chose d'aussi sérieux que de la cryptographie.
votre avatar
Je n'ai pas regardé tous les liens, mais rien que dans le premier, le mot Rust n'est cité à aucun moment. L'articule évoque des failles processeur (entre autre) et non des failles lié à un langage. Le C n'est pas plus épargné par ces failles liées à des attaques par canal auxiliaire, même s'il peut y avoir des stratégies d’atténuation. Ces stratégies d’atténuation (comme le parasitage des signaux analysés) ne sont pas lié à un langage.

Le deuxième lien ne fait pas plus référence au langage Rust. Je me suis arrêté là, car je vois pas en quoi ces attaques par canal auxiliaire assez connues sont liées particulièrement à Rust, d'autant que je vous ai cité une bibliothèque Rust qui annonce des bibliothèques en temps constant : https://github.com/RustCrypto/crypto-bigint. Après je n'ai pas étudié cette bibliothèque, mais le temps constant est bien évoqué dans la description du projet.

Edit : Rust est bien affecté par des attaques par canal auxiliaire, lorsque c'est le processeur qui n'arrive pas à faire des calculs en temps constant, mais dans ce cas le C/C++ est affecté tout autant, et dans les deux langages il peut y avoir des stratégies d’atténuation. Ma question est plutôt, existe-il des liens qui explicitent en quoi Rust est plus problématique par rapport à un autre langage sur ces questions ?
votre avatar
Est-ce que Rust plus problématique que le C ? Dans l'absolue oui car il n'est pas possible créer des librairies en Rust pour figer le code. Ainsi, si je produis une crate pour un chiffrement sensible, je ne dispose d'aucune garanti que le code généré ne vas pas changer, suite par exemple à une MaJ du compilateur (e.g., modification d'un cmov avec jmp). Sur ce point, le C est légèrement plus robuste car on peut, dans une certaine mesure, figé des choses en disant au compilo "Touche pas à ça petit con".
L'autre défaut à mon sens, c'est que l'inclusion d'asm en Rust n'apporte aucune garanti à ma connaissance que le compilateur ne va pas modifier l'ordre des instructions, en C tu peux garantir ceci.
En pratique, la seule façon d'être robuste (en Rust comme en C) et d'utiliser une lib "de confiance" (comme tu l'as mentionné dans ton précédent poste).

Le défaut majeure de Rust est cette manie à vouloir tout réécrire. Très bien, si ça fait plaisir à des personnes de coder en Rust et de moderniser de vieilles choses en C/C++, allez-y. Mais vouloir reprogrammer du chiffrement en Rust (comme AES), c'est prendre un risque si jamais c'est mal fait.

Si tu couples avec l'effet NPM de Rust et ses crates, tu arrives à quelque chose où des implémentations cryptographiques vulnérables vont se retrouver cacher au fin fond d'un empilement de crate pour des services exposés sur le Web. C'est pas comme si on n'avait pas le retour d'expérience avec NPM ou Pip.

Mitigons ce point par le fait que les algorithmes de chiffrements modernes (i.e, plus récent qu'AES) tel que Chacha20 sont conçus pour éviter une partie des défauts de l'AES et de ce type d'attaque, car les LUT n'existent plus dans le design et repose que sur des opérations que l'on sait produire en temps constant.


Concernant les liens et les sources, tu as les trois papiers (mais tu as déjà capté l'idée) et le reste n'est que de la logique qui a déjà été éprouvé avec le C (cf. RSA et l'exponentiation modulaire).


Conclusion de mon point. Si je dois utiliser du chiffrement en Rust (e.g. AES) , je chercherai idéalement une lib de référence (e.g., standard ou certification FIPS). A défaut quelque chose qui s'appuie sur des librairies éprouvées dans d'autres langages. Dans le pire des cas, une implémentation reposant uniquement sur l'usage des instructions AES-NI. Tout le reste, en dehors d'un projet perso sans conséquence, je ne voudrais même pas l'inclure.


Ultime conclusion: Rust est un langage "memery safe" (même s'il y a des limites) contrairement au C ou C++. Mais Rust et le C ne sont pas langages "constant time".
votre avatar
Je vois. Je peux ajouter si vous n'utilisez pas AES-NI, vous perdez énormément en performance quel que soit le langage utilisé, tout en prenant effectivement un risque non négligeable que votre implémentation ne soit pas en temps constant. Mais même en temps constant, à mon sens, ce n'est pas pratique d'avoir une implémentation très peu performante, ce qui est le cas si ce n'est pas AES-NI. Dans ce cas, il faudra effectivement préférer ChaCha20 (y compris en C/C++), non pas qu'il soit particulièrement moderne, même s'il est effectivement plus récent, mais surtout qu'il est nativement conçu pour un processeur ancien ou moderne (un processeur tout court), là où AES fait des opérations sur les bits individuels, ce qui est possible mais pas naturel vu que l'octet est la plus petite unité. ChaCha20 sera plus performant que AES sans circuit dédié pour AES tout en étant facilement implémentable en temps constant.

Maintenant implémenter soit même un algorithme de chiffrement est un risque en soit, quelque soit l'algorithme et quelque soit le langage, et il vaut mieux se baser dans tous les cas sur des implémentations faites par des développeurs spé math, validées pourquoi par la NIST. En France, je dirais "validé par l'ANSSI" (en plus de la NIST (qui peut le plus, peut le moins)).
votre avatar
Au passage, quelqu'un aurait une source d'information sur OVHCloud et Rust, en particulier pour les services HP ?
Le seul truc que je trouve, c'est du VPS pour jouer à un jeu vidéo.

Et j'ai bien la source, mais j'ai tellement l'impression de lire un billet bullshit mi-marketing mi-IA que je doute même de la véracité de l'information dans le lien donné par Next.
votre avatar
Merci d'avoir pointé que la source en lien n'est pas fiable. Ce sont des affirmations non sourcées et partisanes. Cette page est probablement écrite par la boite partenaire qui vit de Rust : formation et conseil.

J'en ai profité pour regarder les autres sources du paragraphe et rien de bien intéressant, là non plus.

Je me demande vraiment comment on peut titrer que c'est un langage devenu incontournable !

Quant à son inventeur qui s'enorgueillit du nombre de modifications faites depuis la version 1.0, je me demande s'il se rend compte que ces très nombreuses modifications montrent que le langage n'était pas mûr. Un langage qui évolue trop n'est pas encore mature.

Retour sur 10 ans de Rust, un langage devenu incontournable

  • Un projet personnel en 2006, changement de braquet en 2009

  • Une vie agitée entre 2015 et 2021

  • Présentation de Rust par ceux qui l’utilisent (ou le conseillent)

  • Graydon Hoare (inventeur du Rust) reprend la parole

  • 10 ans de Rust en chiffres

Fermer