Améliorer la fiabilité des programmes C avec VeriFast
Un aperçu de comment VeriFast améliore la vérification des programmes C en utilisant des systèmes formels.
― 7 min lire
Table des matières
Ces dernières années, s'assurer que les programmes informatiques sont corrects et fiables est devenu de plus en plus important. Un moyen de le faire, c'est à travers un processus appelé Vérification, qui check si un programme se comporte comme prévu. Dans ce contexte, on va voir comment un outil appelé VeriFast aide à vérifier les programmes C, surtout en lien avec un système formel appelé CH2O. Cet article expliquera les méthodes utilisées pour garantir la correction des programmes, décrira les améliorations apportées à VeriFast et fournira un exemple simple de fonctionnement de la vérification.
Contexte de la Vérification
La vérification, c'est le processus qui permet de confirmer qu'un programme se comporte comme prévu. Pour les programmes C, souvent utilisés pour développer divers logiciels, il est crucial de s'assurer qu'ils n'ont pas de comportements indéfinis. Un comportement indéfini peut causer des problèmes sérieux, comme accéder à de la mémoire que le programme ne devrait pas toucher, ou provoquer des courses de données où plusieurs processus essaient de modifier les mêmes données en même temps.
VeriFast est un outil développé pour aider dans ce processus de vérification. Il prend des programmes C et les compare à certaines règles et spécifications pour voir s'ils se comportent correctement. Cependant, il est important de noter que même si VeriFast est un outil utile, il n'a pas été formellement vérifié. Ça veut dire qu'on ne peut pas lui faire totalement confiance sans ajouter une couche de vérification supplémentaire.
Coq et CH2O
Le Rôle dePour adresser l'incertitude autour de VeriFast, une étape supplémentaire a été introduite. En utilisant un assistant de preuve appelé Coq, on peut créer un certificat de correction pour chaque réussite de vérification d'un programme C. Ce certificat est en gros une preuve formelle qui montre que le programme est correct selon un ensemble de règles définies par un autre système connu sous le nom de CH2O.
CH2O fournit une méthode formelle pour comprendre les programmes C, surtout ceux qui respectent la norme C11. Ça veut dire que quand un programme est vérifié avec CH2O, on est garanti qu'il fonctionnera correctement avec n'importe quel compilateur conforme à C11.
Améliorations de VeriFast
Les efforts pour améliorer VeriFast se concentrent sur deux domaines principaux. D'abord, le code Coq utilisé pour la vérification a été réorganisé pour utiliser un outil de bibliothèque appelé STDPP. Cette mise à jour simplifie de nombreux aspects du processus de preuve, le rendant plus facile et plus efficace.
Ensuite, le backend principal de VeriFast a été changé de CompCert à CH2O. Ce changement est important car CH2O fournit une sémantique formelle du C qui est fidèle à la norme C11 sous-jacente. Les avantages de cette mise à jour incluent un modèle de mémoire intéressant qui permet à la fois des opérations bas niveau et des analyses de compilateur de haut niveau.
Le Défi de la Complexité
VeriFast est un outil complexe avec plusieurs fonctionnalités, ce qui rend la vérification directe difficile. L'objectif initial de vérifier VeriFast lui-même semblait être une tâche colossale à cause de ses complexités internes. Cependant, une solution a été trouvée en étendant VeriFast pour produire des preuves vérifiables par machine à chaque réussite de vérification.
Ces preuves prennent la forme de scripts Coq qui, une fois vérifiés, démontrent que le programme C original est correct selon les spécifications conçues.
Comment Fonctionne la Vérification
Pour illustrer comment la vérification se fait, on peut regarder un exemple simple de programme. Cet exemple montrera comment les différentes étapes du processus de vérification se rejoignent.
Exemple de Programme
Prenons un programme C simple qui compte à rebours à partir d'un nombre donné. La première étape dans le processus de vérification implique d'utiliser un outil qui génère un script Coq contenant l'arbre de syntaxe abstraite (AST) pour ce programme. L'AST est une représentation structurée du programme qui aide avec le processus de vérification.
Ensuite, on exécute VeriFast sur ce programme C en utilisant un flag spécifique qui lui dit de générer une preuve Coq. Le résultat est un autre script Coq qui contient la preuve générée par VeriFast.
Enfin, on compile les deux scripts Coq pour vérifier si la preuve est correcte. Si le compilateur Coq accepte la preuve, on peut conclure que le programme respecte ses conditions spécifiées.
Analyse des Scripts Coq
Le script Coq généré par l'outil CH2O contient toutes les déclarations nécessaires du programme, tandis que le script généré par VeriFast inclut les annotations et conditions qui guident la vérification. L'étape suivante consiste à traduire l'AST C abstrait de CH2O dans une autre forme adaptée à la preuve.
Établir la relation entre ces deux formes est vital pour la validité de la preuve. Une fois cette relation établie, on peut démontrer la correction en la reliant à l'exécution du programme original, assurant que le programme se comporte comme prévu.
L'Importance de la Solidité
La solidité dans ce contexte signifie que si un programme est prouvé correct par l'outil de vérification, il se comportera correctement quand il sera exécuté. C'est crucial car ça donne une couche de confiance dans la fiabilité du programme.
En reliant la correction du programme à des principes de correction connus dans CH2O, on peut créer une chaîne de raisonnement qui soutient nos affirmations de correction.
Cette chaîne inclut diverses transformations et étapes qui montrent finalement que le programme respecte ses spécifications sans rencontrer de comportement indéfini.
Défis à Venir
Bien que les processus mentionnés soient efficaces, il y a encore des défis à relever. L'ensemble actuel des fonctionnalités dans les programmes C supportés est limité. Les travaux futurs devront ajouter plus de fonctionnalités comme les pointeurs, les structures et l'allocation dynamique de mémoire.
De plus, la capacité à vérifier des programmes plus complexes signifie que les outils de vérification actuels devront être améliorés ou adaptés. À mesure que les programmes deviennent plus compliqués, de nouvelles stratégies seront nécessaires pour gérer des tâches de vérification de plus en plus complexes.
Le support des programmes concurrents est un autre défi majeur. Comme CH2O et CompCert sont à thread unique, gérer plusieurs threads nécessitera une planification minutieuse et des sémantiques supplémentaires.
Conclusion
En conclusion, vérifier les programmes C est essentiel pour créer des logiciels fiables et sans bugs. L'outil VeriFast combiné aux systèmes formels de CH2O et Coq offre une manière prometteuse d'accomplir cette tâche. Les améliorations continues de ces outils et techniques visent à renforcer le processus de vérification, s'assurant que des programmes C plus complexes puissent être effectivement validés contre les comportements attendus.
En avançant, l'intégration de plus de fonctionnalités et le développement de stratégies pour gérer des scénarios complexes amélioreront encore la capacité à faire confiance à la correction des logiciels. Cet effort continu contribuera finalement au domaine de la fiabilité des logiciels, assurant que les programmes fonctionnent correctement et en toute sécurité dans divers environnements.
Titre: Certifying C program correctness with respect to CH2O with VeriFast
Résumé: VeriFast is a powerful tool for verification of various correctness properties of C programs using symbolic execution. However, VeriFast itself has not been verified. We present a proof-of-concept extension which generates a correctness certificate for each successful verification run individually. This certificate takes the form of a Coq script which, when successfully checked by Coq, removes the need for trusting in the correctness of VeriFast itself. The Coq script achieves this by applying a chain of soundness results, allowing us to prove correctness of the program with regards to the third-party CH2O small step semantics for C11 by proving correctness in terms of symbolic execution in Coq. This proof chain includes two intermediate auxiliary big step semantics, the most important of which describes VeriFast's interpretation of C. Finally, symbolic execution in Coq is implemented by transforming the exported AST of the program into a Coq proposition representing the symbolic execution performed by VeriFast itself.
Auteurs: Stefan Wils, Bart Jacobs
Dernière mise à jour: 2023-08-29 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2308.15567
Source PDF: https://arxiv.org/pdf/2308.15567
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.