--- title: "Conception formelle : introduction" date: 2023-01-06 tags: ["Bugs", model-checking"] categories: ["Conception formelle", "Cours"] mathjax: true --- ## Pourquoi? ### Un peu d'histoire: les bugs célèbre ### 1985 : Banque de New-York Un entier passe de 32768 à 0, conséquence : 2 jours d'interruption de service et 24 milliards de dollars d'emprunt et plus de 5 millions de perte. ### 1990: AT&T Un `break` est oublié dans un `case` comme dans l'exemple ci-dessous: ```c switch(i) { case 1 : function1(); break; case 2 : function2(); // a forgotten break; default: defaultfunction(); } ``` 75 millions d'appels téléphonique dans le vide, pour *American Airline*, 200 000 réservations en moins. Heureusement AT&T utilisait déjà le réseau pour les déploiement. Si la propagation du bug a été accélérée, le **déploiement du patch** aussi. ### 1994 : bug du Pentium Une erreur de calcul dans une fonction très particulière de processeur entrainait une erreur de calcul. La réponse d'*Intel* fut peu sympathique à l'époque qui assurait que peu de personnes utilisaient cette fonction etdonc **qu'ils ne fixeraient pas** le problème. Depuis, *Intel* publie les preuves de calculs de leurs processeurs, tout comme *AMD*. ### 1996 : Ariane 5 Destruction de la fusée après 39 secondes de vol suite à deux grandes erreurs : 1. conversion d'un entier 64 bits vers 16 bits avec overflow 2. les deux ordinateurs utilisés pour la redondance partageaient le même code. Le bug était donc présent sur les deux machines. ### 1985 - 1987 : Thernac 25 Nous sommes ici en présence du premier bug ayant tué un humain. Le Thernac 25][l_thernac] était une machine utilisée en radiothérapie pour le traitement des cancers. Des patient se sont plaint de sensation de forte brulure lors de séances. Il a fallut attendre trois ans et au moins **4 morts** pour que le fabricant rappelle ce modèle et mène l'investigation [l_thernac 25]: https://fr.wikipedia.org/wiki/Therac-25 ## Besoin de fiabilité Dès les années 1990, il y a une prise de conscience générale de la **nécessité** de garanties pour le développement logiciel. Ce qui comprend ben entendu **les test** effectués sur le code, l'**uniformisation** de la sémantique utilisée(UML -- *Universal Modelisation Laguage*), les **design patterns**. ## Panorama des méthodes formelles Le but des méthodes formelles est de raisonner autour des logiciels pour déterminer les contrôles et comportements par les **méthodes mathématiques**. Il faut pour cela obtenir un modèle former par l'analyse et le tester. * est-ce que le modèle est le bon, est-il correct? : **la validation** * pouvons nous vérifier le modèle? : **la décidabilité**[^n_decidabilite] * pouvons nous traduire les résultats? : **l'abstraction** [^n_decidabilite] ne proposition (on dit aussi énoncé) est dite décidable dans une théorie axiomatique si on peut la démontrer ou démontrer sa négation dans le cadre de cette théorie. Un énoncé mathématique est donc indécidable dans une théorie s'il est impossible de le déduire, ou de déduire sa négation, à partir des axiomes de cette théorie. Source [Wikipedia](https://fr.wikipedia.org/wiki/D%C3%A9cidabilit%C3%A9) ### Pour qui? Les méthodes coûtent cher et le personnel qualifié manque. Par conséquent seul les entreprises développant des systèmes complexes et/ou critiques les utilisent. Quelques précisions : * **complexes** : beaucoup d'interactions entre les composants * **critiques** : important, que se soit économiquement, humainement ou les deux. ### Les outils L'idée derrière ce type d'outils: **manipuler les preuves** : un programme est un théorème, est-il adapté? C'est**un autre problème**. Ces outils ne sont pas entièrement automatiques. #### Interprération abstraite Transformer une problème concret en un problème abstrait plus simple, rendant la preuve plus facile à produite \\( \(M_{\text{concret}} \models \phi\) \implies \( M_{\text{abstrait}} \models \phi \) \\) #### Vérification du modèle Prendre en entrée un modèle \\(M\\), une spécification \\(\phi\\). ON vérifie alors que \\(M\ \models \phi \). #### Raffinement et implémentation Autoriser la transformation d'une spécification en implémentation tout en préservant à chaque étapes les propriétés essentielles à notre système. #### Gestion des tests Génération de séquences de tests sur le modèle d'après la spécification. Ces tests dépendent du but recherchés. Les test de **conformités** sont utilisés pour valider le vrai système. Les tests **d'interopérabilité** valident le système dans un contexte ouvert. #### Système Stochastique Utiliser les chaines de [Markov][l_markov] et les [processus stochastique] [l_stockas] pour étudier la probabilité qu'un évènements se produise. ## Choix de la méthode ![Schéma en V, source Alain Griffault](./imgs/schema_v.png) Il n'y a pas une méthode à choisir, plusieurs méthodes formelles à appliquer en fonction de la position dans le cycle. ### model checking N'utilisons pas les données mais prouvons les interaction inter-modules : * pour clarifier le *cahier des charges* * pour aboutir un *cahier des charges* ### Preuve de théorème Ici nous validons l'algorithme afin de prouver qu'il fonctionne. Nous pouvons alors implémenter soir dans un langage généraliste, soir dans un langage dédié (donc spécifique). On obtient alors **un code certifié**. ### Analyse de code binaire Obtenir des garanties sur le code binaire -- qu'ils ne perturbent pas le système -- sans pour autant avoir le code source. ``` code source -> décompilation -> modèle -> analyse ``` ### Génération de tests Génération de tests pertinents pour notre application partir du modèle et du cahier des charges. [l_markov]:https://fr.wikipedia.org/wiki/Processus_de_Markov [l_stockas]:https://fr.wikipedia.org/wiki/Processus_stochastique