C2Rust : un outil qui permet de faire la traduction et la refactorisation de votre code écrit en langage C
vers le langage Rust

Immunant Inc. et Galois Inc. viennent de publier C2Rust, un outil open source capable de traduire la plupart des modules C en code Rust sémantiquement équivalent. Ces modules sont destinés à être compilés séparément afin de produire des fichiers objet compatibles. Le traducteur se concentre sur la prise en charge de la norme C99. Le code source écrit en C est analysé et vérifié à l'aide de Clang avant d'être traduit par C2Rust. Il s'agit d'un projet open source et publié sous la licence BSD v3.

C2Rust vous aide à traduire un code conforme à la spécification C99 vers un équivalent écrit avec le langage de programmation Rust. Il est développé conjointement par Immunant Inc et Galois Inc, deux entreprises concevant des logiciels et des systèmes de sécurité. Galois développe des technologies pour garantir la fiabilité des systèmes en cas de défaillance inacceptable. L’entreprise dit appliquer l'informatique de pointe et les mathématiques pour améliorer la fiabilité des logiciels et du matériel informatique. Immunant quant à lui, est une entreprise qui développe des solutions de sécurité personnalisées. Elle est spécialisée dans la recherche de pointe en fonction des logiciels que vous développez et des menaces auxquelles vous êtes confrontés.

Selon la documentation qui l’accompagne, le traducteur (ou le transpiler) C2Rust produit un code Rust non sécurisé qui reflète étroitement le code C en entrée. L'objectif principal du traducteur est de produire un code fonctionnellement identique au code C saisi. Générer un code Rust sûr ou idiomatique n’est pas un objectif pour le traducteur, a indiqué ses concepteurs. Ainsi, l’équipe de C2Rust a indiqué que la meilleure approche consiste à réécrire progressivement le code Rust traduit à l'aide d'outils de refactoring dédiés. Ce qui les a amenés vers un outil de refactoring qui réécrit Rust en traduction automatique non sécurisée en idiomes plus sûrs.

Nom : z1.png
Affichages : 16175
Taille : 71,0 Ko

Néanmoins, certaines refactorisations devront être effectuées à la main, ce qui peut introduire des erreurs. L’équipe a expliqué qu'elle fournit à cet effet des plugins pour Clang et RustC. À noter que Clang fournit une infrastructure frontale et d'outils aux langages de la famille de langages C (C, C++, Objective C/C++, OpenCL, CUDA et RenderScript) du projet LLVM. Vous pouvez ainsi compiler et exécuter deux binaires et vérifier qu'ils se comportent de manière identique (au niveau des appels de fonction). Pour fonctionner, C2Rust nécessite LLVM 6, 7 ou 8 avec son compilateur et ses bibliothèques Clang correspondants. Il vous faut également avoir installé dans votre environnement Python 3.4 ou ultérieur, CMake 3.4.3 ou ultérieur et openssl (1.0).

LLVM est une infrastructure de compilateur conçue pour l'optimisation du code à la compilation, à l'édition de liens, voire à l'exécution ou durant les « temps morts » d'un programme, quel que soit le langage d'origine. Il fournit un ensemble de technologies de compilateur et de chaîne d'outils modulaires et réutilisables. Pour l’instant, C2Rust semble n’être disponible que pour les environnements GNU/Linux, car Immunant et Galois n’ont mentionné que la prise de C2Rust avec Ubuntu 16.04 LTS, 18.04 et 18.10, Arch Linux et quelques autres distributions Linux. Vous pouvez obtenir plus d’informations sur la procédure d’installation sur le dépôt Git du projet C2Rust.

Après l’installation, la traduction du code C en Rust requiert les commandes de compilateur exactes utilisées pour générer le code C. Pour fournir cette information, vous aurez besoin d'un fichier standard « compile_commands.json ». De nombreux systèmes de génération peuvent générer automatiquement ce fichier, comme il est utilisé par de nombreux autres outils, mais vous devriez vous rapporter aux recommandations fournies dans son dépôt Git pour savoir comment générer ce fichier pour les processus de construction courants. Cependant, ce n’est pas encore une solution à toute épreuve et il manque encore de beaucoup de choses, a notifié son équipe de développement.

Elle a donc informé qu’il existe plusieurs limitations connues dans ce traducteur. Le traducteur émettra un avertissement et tentera d'ignorer les définitions de fonctions qui ne peuvent pas être traduites. Par exemple, les fonctionnalités suivantes ne sont pas encore implémentées : définitions de fonctions variadiques (blocage du problème Rust), préservation des commentaires (travaux en cours), les types « long double » et « _Complex » (partiellement bloqués par le langage Rust), les fonctions ou types SIMD non x86/64 et les fonctions ou types SIMD x86/64 qui n'ont pas d'équivalent en Rust.

Il existe également d’autres fonctionnalités non implémentées que vous pourrez retrouver dans la documentation de l’outil et d’autres pour lesquelles l’équipe a indiqué qu’il est possible qu’elles ne soient jamais implémentées. Parmi ces dernières, on peut citer « longjmp » et « setjmp ». Pourquoi ? Bien qu'il existe des composants intrinsèques de LLVM pour ces derniers, a indiqué les développeurs de C2Rust, il est plus ou moins difficile de savoir comment ceux-ci interagissent avec Rust (en particulier, Rust idiomatique). D’autres informations sur l’outil indiquent que la « printf » n’est pas disponible, car vous aurez besoin d'inclure des en-têtes pour utiliser les fonctions de bibliothèques externes.

Pour finir, sachez que lorsque le traducteur ne peut pas gérer la traduction d'une fonction pour une raison quelconque, il omet l'implémentation et imprime la raison, a déclaré l’équipe. Ceci est configurable et visible lorsque vous exécutez l'outil localement. De plus, il peut arriver que votre définition de type ne soit pas traduite. Notez dans ce cas que les types qui ne sont pas utilisés pour générer du code sont simplement supprimés. Vous devez donc essayer d'utiliser votre type dans une déclaration de fonction.

Source : C2Rust

Et vous ?

Que pensez-vous de C2Rust ?
Le trouvez-vous pertinent, utile, dangereux ou efficace ?
Comment l'outil peut-il être davantage amélioré selon vous ?

Voir aussi

L'équipe de Rust dévoile la version 1.32.0 du langage de programmation, l'allocateur de mémoire est supprimé par défaut

Python est sacré langage de programmation de l'année 2018 par l'index TIOBE, deviendra-t-il le langage le plus utilisé des programmeurs ?

Le langage Go continue sa progression avec de nombreux développeurs qui l'utilisent dans les projets professionnels et personnels, selon un sondage