Académique Documents
Professionnel Documents
Culture Documents
4
Vérification au plus haut
niveau
5
Vérification au plus haut
niveau
6
Vérification au plus haut
niveau
7
Vérification au plus haut
niveau
8
Vérification au plus haut
niveau
9
Vérification au plus haut
niveau
10
Objectifs de la vérification
❑ Eviter les bugs
❑ Assurer la qualité
❑ Réduire le coût
Validation et vérification
Validation – Principe générale
Le système est-il conforme au cahier des charges ?
17
Qu’est-ce qu’une Technique
Formelle?
Tests Vs Techniques Formelles
18
Qu’est-ce qu’une Technique
Formelle?
Exemple
19
Qu’est-ce qu’une Technique
Formelle?
Exemple
20
Qu’est-ce qu’une Technique
Formelle?
Exemple
21
Qu’est-ce qu’une Technique
Formelle?
Exemple
22
Qu’est-ce qu’une Technique
Formelle?
Technique Formelle : définition rigoureuse
26
Principe du model-checking
27
Principe du model-checking
28
Principe du model-checking
29
Principe du model-checking
⚫ L’automate explicite est un modèle des
comportements possibles du programme
⚫ Explorer l’automate = étudier les propriétés
du programme
⚫ Problème : l’automate est généralement
infini (ou énorme)) impossible de l’explorer
⚫ Idée : travailler sur une abstraction finie (et
pas trop grosse) de l’automate
⚫ Cette abstraction doit conserver certaines
propriétés du programme
30
Vérification de programme Lustre
⚫ Les méthodes de vérification s’appliquent à tout
langage/formalisme basé sur une notion de
temps discret
➔ Lustre et les autres langages synchrones, et bien
d’autres ...
H B’
(Assertion)
Pg O
I Programme à
vérifier Phi B
Propriété à
démontrer
Pg_Phi 35
Vérification par assertion
Permet au concepteur d'expliciter les hypothèses
faites sur l'environnement et/ou sur le programme
lui-même
➔ Permet d'optimiser la compilation
➔ Permet la vérification de propriétés sous conditions
➔ Simplifie la conception des programmes
Exemple :
assert (not (X and Y))
affirme que les flots booléens X et Y ne doivent jamais être
vrais simultanément
⚫ Mais…
seul Justin peut manœuvrer la barque
la barque ne contient que deux places (Justin + loup, ou
Justin + chèvre, ou Justin + chou)
en l'absence de Justin, la chèvre mange le chou
en l'absence de Justin, le loup mange la chèvre
➔ flots booléens
bn = vrai signifie que l'action b est effectuée à l'instant n
bn = faux signifie que l'action b n'est pas effectuée à
l'instant n
38
Justin, le loup, la chèvre
et le chou…
⚫ Les sorties du programmes :
J : position de Justin
W : position du loup
G : position de la chèvre
C : position du chou
41
Justin, le loup, la chèvre
...
et le chou…
J = 0 -> 1 - pre(J);
W = 0 -> if mw then 1 - pre(W) else pre(W);
G = 0 -> if pre(G) = 2 then pre(G) else if mg then 1 - pre(G)
else if (pre(G)=pre(W) and not mw)
then 2 else pre(G);
C = 0 -> if pre(C) = 2 then pre(C) else if mc then 1 - pre(C)
else if (pre(C)=pre(G) and not mg)
then 2 else pre(C);
...
0 1 2 3 4 5 6 7
Principe :
⚫ Expression des propriétés attendues sous la forme de
nœud LUSTRE retournant un flot booléen
⚫ Composition de ce nœud avec le programme à vérifier
⚫ Examen de l’automate obtenu
Outils :
⚫ Permet la vérification de programmes mettant en
œuvre des flots booléens et des flots numériques
définis par des relations linéaires
⚫ LESAR et NP-tools (intégré dans l’outil SCADE)
43
Vérification par module concurrent
Pg O observateur
Programme à
I
vérifier
Phi
Propriété à B
démontrer
Pg_Phi
Exemple :
node never (A : bool) returns (B : bool);
let
B = not A -> not A and pre(B);
tel
47
Notion d’automate : rappel
⚫ Un automate est un graphe orienté permettant de
décrire l’ensemble des états possibles d’un système
ainsi que son comportement dynamique
49
Programme Lustre = automate
Exemple passage code Lustre → automate
node notE(E :bool) returns(S :bool);
let
S = not E ;
tel
50
SL : Safety Logic
⚫ En vérification formelle Lustre, la logique permettant
de décrire les formules à vérifier est exprimable en
langage Lustre
⚫ Il s’agit de la logique temporelle SL pour Safety Logic
➔ Notion d’observateur
52
Exemple complet : le
chronomètre STOP_WATCH
Cahier des charges
Le but est de spécifier le comportement d’un
chronomètre simplifié. Le chronomètre dispose de 3
entrées de trois boutons :
On_off : permet d’activer et de désactiver le
chronomètre;
reset : remet le chronomètre à zéro quand le
chronomètre est désactivé;
freeze : gèle ou dégèle l’affichage quand le
chronomètre est actif
Prototype du noeud :
node STOPWATCH(on_off, reset, freeze : bool)
returns (time : int );
53
Exemple complet : le
chronomètre STOP_WATCH
Travail préliminaire : l’opérateur COUNT
⚫ Spécification :
Remise à 0 si reset, sinon il est incrémenter si X;
Tout se passe comme si C valait 0 à l’origine
54
Exemple complet : le
chronomètre STOP_WATCH
Travail préliminaire : l’opérateur COUNT
55
Exemple complet : le
chronomètre STOP_WATCH
Travail préliminaire : l’opérateur COUNT
⚫ Spécification :
Passe de False à True si on;
Passe de True à False si off ;
Tout se comporte comme si S était False à l’origine ;
Doit fonctionner correctement même si off et on sont les
mêmes
⚫ Hypothèses sur l’environnement extérieur :
On et off ne sont jamais à True deux fois de suite... Cette
hypothèse simule un appui court sur un interrupteur, par
exemple... 57
Exemple complet : le
chronomètre STOP_WATCH
Travail préliminaire : l’opérateur SWITCH
58
Exemple complet : le
chronomètre STOP_WATCH
Travail préliminaire : l’opérateur SWITCH
59
Exemple complet : le
chronomètre STOP_WATCH
Description du nœud STOP_ SWITCH
node STOP_WATCH (on_off, reset, freeze : bool)
returns (time : int) ;
assert(true -> not(on_off and pre(on_off)))
assert(true -> not(reset and pre(reset)))
assert(true -> not(freeze and pre(freeze)))
var running, freezed : bool , cpt : int ;
let
running = SWITCH (on_off, on_off) ;
freezed = SWITCH( freeze and running,
freeze or on_off) ;
cpt = count( reset and not running, running) ;
time = if freezed
then ( 0 -> pre(time))
else cpt ;
tel 60
Exemple complet : le
chronomètre STOP_WATCH
Exécution du nœud STOP_ SWITCH
61
Exemple complet : le
chronomètre STOP_WATCH
Vérification du nœud STOP_ SWITCH
Nous cherchons à vérifier la propriété de sûreté suivante :“ Il n’est
pas possible de remettre à zéro le compteur en cours d’exécution”
➔ Pour cela, nous ajouterons une hypothèse supplémentaire au
nœud principal :
assert(on_off = true -> false)
Idée : Le chronomètre est activé à l’instant initial et reste en
exécution jusqu’à la fin...
Nous construisons le noeud permettant d’observer cette propriété :
node observateur_prop(on_off, reset, freeze : bool,
S : int) returns (P : bool)
let
P = true -> if (S=0) then false else pre(P) ;
tel
62
Exemple complet : le
chronomètre STOP_WATCH
Vérification du nœud STOP_ SWITCH
Nous construisons ensuite le noeud de vérification :
sec F F F F V F V V V F F F V V V V V V V V
bal V V V V F V F F F V V V F F F F F F F F
alheure V V V F F F F F V V V F F F V V V V V F
retard F F F F F F F F F F F F F F F F F F F V
avance F F F V V V V V F F F V V V F F F F F F
Méthodes Formelles 66
Exemple du compteur de balises
Quelques propriétés en Lustre :
⚫ On ne peut pas être en avance et en retard :
ok = not (avance and retard);
1. La propriété :
« Si le train stoppe, il finira par être en retard »
est une liveness, elle ne peut pas être vérifiée
en utilisant le model checker Lesar
69
Notre objectif …
Apprendre à concevoir et à vérifier un
logiciel embarqué critique …
70
Quel avenir ? https://www.systerel.fr/
Quel avenir ? https://www.ansys.com/fr-fr/
Quel avenir ? https://www.ansys.com/fr-fr/
Quel avenir ? https://www.elsys-design.com/fr/
Quel avenir ? https://www.aerocontact.com/
Quel avenir ? https://www.apec.fr/