Un nouvel outil pour la transpilation de code Rust en toute sécurité
Cet outil améliore la conversion de code en Rust, en se concentrant sur la sécurité et la lisibilité.
― 8 min lire
Table des matières
- Le défi de la transpilation sécurisée
- Méthodes existantes de transpilation
- Présentation d'un nouvel outil pour la transpilation en Rust
- Évaluation de l'outil
- Produire un code Rust sûr et lisible
- Extensibilité et travaux futurs
- Travaux connexes dans le domaine
- Limitations et défis
- Conclusion
- Source originale
- Liens de référence
Rust est un langage de programmation qui vise à être sûr et efficace. Il est conçu pour éviter les erreurs de mémoire, qui sont courantes dans d'autres langages comme le C. Grâce à ses fonctionnalités de sécurité, beaucoup d'entreprises sont intéressées à convertir du code existant écrit dans d'autres langages en Rust. Ce processus s'appelle la Transpilation.
Il existe différentes méthodes pour transpiler du code. Une façon est d'utiliser des règles ou des motifs pour traduire manuellement le code d'une langue à une autre. Une autre méthode consiste à utiliser des grands modèles de langage (LLM), qui sont entraînés sur de nombreux exemples de programmation. Ces modèles peuvent générer du code en fonction d'entrées, mais ils ne garantissent souvent pas que le code généré fonctionnera correctement.
Cet article discute d'un outil qui combine les deux approches pour produire un code Rust lisible et sûr. Il vise à s'assurer que le nouveau code Rust se comporte de la même manière que le code d'origine.
Le défi de la transpilation sécurisée
Transpiler du code en Rust pose plusieurs défis. L'objectif est de créer du code Rust qui non seulement fonctionne correctement, mais est aussi facile à lire et à maintenir. Les méthodes traditionnelles basées sur des règles peuvent produire du code techniquement correct mais difficile à lire. D'un autre côté, les modèles de langage peuvent générer du code plus lisible, mais ils échouent souvent à garantir la justesse.
Alors que Rust gagne en popularité, de plus en plus de gens cherchent à migrer leur code existant vers Rust pour profiter de ses fonctionnalités de sécurité. Cependant, convertir de grandes bases de code est une tâche complexe qui nécessite généralement une quantité importante de travail manuel.
Méthodes existantes de transpilation
Il existe deux méthodes principales pour transpiler du code en Rust : l'approche basée sur des règles et l'approche basée sur les LLM.
Approches basées sur des règles
Les approches basées sur des règles utilisent des règles prédéfinies pour convertir du code d'un langage à un autre. Cette méthode peut théoriquement produire un code correct, mais elle mène souvent à un code illisible qui ne tire pas pleinement parti des fonctionnalités de Rust.
Par exemple, lors de la conversion du C ou du C++ en Rust en utilisant une méthode basée sur des règles, la sortie peut ressembler à du langage d'assemblage plutôt qu'à un code de haut niveau. Cela rend difficile pour les développeurs de comprendre et de maintenir le code Rust résultant.
Approches basées sur les LLM
Les approches basées sur les LLM utilisent des modèles qui ont appris à partir d'énormes quantités de code. Ces modèles peuvent générer du code qui ressemble davantage à un code écrit par des humains. Cependant, ils manquent souvent de garanties formelles concernant la justesse de la sortie. Cela signifie que, même si le code généré peut être plus lisible, il peut aussi contenir des bugs subtils qui sont difficiles à détecter.
Présentation d'un nouvel outil pour la transpilation en Rust
Pour répondre aux limites des méthodes existantes, un nouvel outil a été développé. Cet outil tire parti des techniques basées sur des règles et des modèles de langage pour créer un code Rust à la fois lisible et correct.
Comment fonctionne l'outil
L'outil fonctionne en deux étapes. D'abord, il crée un programme Rust de référence en utilisant un compilateur WebAssembly (Wasm), qui sert de base fiable. Ensuite, il utilise un LLM pour générer un programme Rust candidat. Le programme candidat est ensuite comparé au programme de référence pour s'assurer qu'il se comporte de la même manière.
Si le programme candidat ne passe pas la comparaison, l'outil génère une nouvelle version jusqu'à en trouver une qui réussit. Ce processus itératif aide à augmenter les chances de produire un code Rust correct et lisible.
Évaluation de l'outil
L'outil a été testé en convertissant une collection de 1 394 programmes de langages comme le C++, le C et le Go. Les résultats ont montré que la combinaison de LLM avec cette méthode a considérablement augmenté le nombre de programmes Rust qui ont réussi divers contrôles de justesse.
Améliorations de performance
Avec l'outil, le nombre de programmes qui ont réussi des tests basés sur des propriétés et des vérifications limitées a considérablement augmenté par rapport aux précédents essais uniquement avec des LLM. Cela indique que la combinaison des deux approches produit de meilleurs résultats.
Produire un code Rust sûr et lisible
Un des principaux objectifs de l'outil est de générer un code Rust sûr. Pour évaluer son succès à cet égard, l'outil a été appliqué à plusieurs programmes du monde réel qui utilisent beaucoup de pointeurs.
Résultats des programmes du monde réel
Les résultats ont montré que l'outil pouvait produire des traductions Rust sûres pour de nombreux programmes testés. Cependant, il a eu des difficultés avec de plus grands programmes impliquant des interactions de pointeurs plus complexes. Pour des programmes plus simples, le LLM a beaucoup mieux performé et a pu gérer avec succès les règles de propriété qui sont centrales aux fonctionnalités de sécurité de Rust.
Lisibilité du code généré
En plus de la sécurité, la lisibilité est un autre aspect important de la qualité du code. Le code Rust généré s'est avéré plus lisible que les sorties d'autres outils existants. C'est significatif parce qu'un code lisible est plus facile à maintenir et à comprendre pour les futurs développeurs.
Avertissements de linter
Lors de l'évaluation avec Clippy, un linter populaire pour Rust qui vérifie les problèmes potentiels, les sorties de l'outil n'ont produit aucun avertissement. En revanche, d'autres outils ont produit de nombreux avertissements. Cela suggère que l'outil produit non seulement un code correct, mais respecte aussi les meilleures pratiques en programmation Rust.
Extensibilité et travaux futurs
L'outil est conçu pour être flexible et peut accueillir différents Outils de vérification. C'est crucial car divers vérificateurs ont leurs propres forces et limites.
Utilisation de différents vérificateurs
En plus d'utiliser Kani pour la vérification, l'outil est capable d'intégrer d'autres méthodes de vérification. Par exemple, Verus peut mieux gérer les constructions de boucle en Rust, ce qui facilite l'établissement de la justesse dans les programmes impliquant des itérations. Cette flexibilité améliore la capacité globale de l'outil à vérifier ses sorties.
Cas de vérification manuelle
Dans certains cas, une vérification manuelle a été effectuée pour vérifier l'exactitude du code Rust généré. L'outil a montré des résultats prometteurs, vérifiant avec succès plusieurs programmes que les méthodes automatisées n'ont pas pu gérer. Cependant, certains cas nécessitaient encore des spécifications extensives, mettant en lumière un compromis entre vérification automatisée et manuelle.
Travaux connexes dans le domaine
Plusieurs projets précédents ont essayé d'aborder les problèmes de conversion de code et de vérification. Des outils comme Transcoder et C2Rust se concentrent sur la conversion du C en Rust mais manquent souvent de garanties de justesse formelles.
Le rôle des modèles de langage
L'application de grands modèles de langage en programmation continue de croître. Ces modèles peuvent aider dans diverses tâches, y compris la génération de code et le débogage. Cependant, s'en remettre uniquement à eux peut entraîner la génération de code bogué.
Limitations et défis
Malgré les forces du nouvel outil, il n'est pas sans limites. La dépendance aux modèles de langage existants peut introduire des biais basés sur les données sur lesquelles ils ont été entraînés. De plus, la complexité du code du monde réel peut poser des défis que des benchmarks simples ne capturent pas.
Conclusion
L'outil présenté ici représente un pas en avant significatif dans l'effort de transpilation efficace du code vers Rust. En combinant les forces des méthodes basées sur des règles avec les capacités des modèles de langage, il a montré de meilleures performances dans la génération d'un code Rust sûr et lisible. Les travaux futurs se concentreront sur le raffinement de ces méthodes et la fourniture de techniques de vérification plus robustes pour améliorer encore la fiabilité de l'outil.
Titre: VERT: Verified Equivalent Rust Transpilation with Large Language Models as Few-Shot Learners
Résumé: Rust is a programming language that combines memory safety and low-level control, providing C-like performance while guaranteeing the absence of undefined behaviors by default. Rust's growing popularity has prompted research on safe and correct transpiling of existing code-bases to Rust. Existing work falls into two categories: rule-based and large language model (LLM)-based. While rule-based approaches can theoretically produce correct transpilations that maintain input-output equivalence to the original, they often yield unreadable Rust code that uses unsafe subsets of the Rust language. On the other hand, while LLM-based approaches typically produce more readable, maintainable, and safe code, they do not provide any guarantees about correctness. In this work, we present VERT, a tool that can produce readable Rust transpilations with formal guarantees of correctness. VERT's only requirement is that there is Web Assembly compiler for the source language, which is true for most major languages. VERT first uses the Web Assembly compiler to obtain an oracle Rust program. In parallel, VERT uses an LLM to generate a readable candidate Rust program. This candidate is verified against the oracle, and if verification fails, we regenerate a new candidate transpilation until verification succeeds. We evaluate VERT by transpiling a suite of 1,394 programs taken from competitive programming style benchmarks. Combining Anthropic's Claude-2 and VERT increases Rust transpilations passing property-based testing from 31% to 54% and bounded model-checking from 1% to 42% compared to using Claude alone. In addition, we evaluate VERT's ability to generate non-trivial safe Rust on programs taken from real-world C projects that make significant use of pointers. Our results provide insights into the limitations of LLMs to write safe Rust.
Auteurs: Aidan Z. H. Yang, Yoshiki Takashima, Brandon Paulsen, Josiah Dodds, Daniel Kroening
Dernière mise à jour: 2024-05-25 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2404.18852
Source PDF: https://arxiv.org/pdf/2404.18852
Licence: https://creativecommons.org/licenses/by/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.
Liens de référence
- https://cloud.google.com/blog/topics/public-datasets/github-on-bigquery-analyze-all-the-open-source-code
- https://www.anthropic.com/product
- https://console.cloud.google.com/marketplace/details/github/github-repos
- https://doc.rust-lang.org/clippy/
- https://zenodo.org/records/10927704
- https://github.com/facebookresearch/CodeGen