Application : analyse de logiciels embarqu´ es avioniques critiques
TAS : Typage et analyse statique M2, Master STL INSTA, Sorbonne Universit´e
Antoine Min´e
Ann´ee 2018–2019
Cours 14 4 avril 2019
Plan
Introduction
L’analyseur Astr´eede programmes C embarqu´es synchrones conception d’un analyseur sp´ecialis´e
exemples d’abstractions r´esultats exp´erimentaux
L’analyseur Astr´eeAde programmes C embarqu´es concurrents analyse modulaire thread `a thread avec interf´erences
r´esultats exp´erimentaux
Introduction
Introduction
V´ erification des logiciels avioniques
Les logiciels avioniques critiques doivent ˆetrecertifi´es: obligation l´egale
processus r´egul´e par des standards internationaux(DO-178B, DO-178C)
plus de la moiti´edes coˆuts de d´eveloppement
essentiellement bas´e sur des campagnes massives detests et sur la relecture de codepar des pairs(par des humains)
Tendance :
l’utilisation dem´ethodes formellesest officiellement reconnue
(DO-178C, DO-333)
au niveau binaire, pour remplacer le test
auniveau du source, pourremplacer la relecture de code auniveau du source, pourremplacer le test
si la correspondance entre source et binaire est aussi certifi´ee pour v´erifier la robustesse et l’absence d’erreur `a l’ex´ecution
=⇒les m´ethodes formelles permettent d’am´eliorer l’efficacit´e et de r´eduire le coˆut de la certification !
Introduction
M´ ethodes formelles chez Airbus
Preuve de programme : m´ethodes d´eductives
propri´et´es fonctionnellesdepetits morceaux de code s´equentielC remplace le teste unitaire
pas enti`erement automatis´e outilCaveat(CEA, voir aussi FramaC)
Analyse statique sˆure :
analyseenti`erementautomatique de grosses applications, pour des propri´et´esnon fonctionnelles
temps d’ex´ecution maximal, utilisation maximale de pile sur du binaire : aiT, StackAnalyzer(AbsInt)
absence d’erreur `a l’ex´ecution sur du code Cs´equentiel: analyseurAstr´ee(AbsInt)
(d´epassements de capacit´e, erreurs arithm´etiques, d´epassements de tableaux, etc.)
Compilation certifi´ee :
permet l’analyse au niveau dusourcedecertifieraussi lecode binaire
(s´equentiel)
compilateur C CompCert, certifi´e enCoq(INRIA)
Analyse statique sˆ ure
Avantages :
analyse directe du code source(pas d’un mod`ele s´epar´e)
automatique(facile `a utiliser par le programmeur, peu d’interaction n´ecessaire)
efficace
approxim´ee(pour contourner les probl`emes d’ind´ecidabilit´e et de performance)
Sˆuret´e :
bas´ee sur la s´emantique (sp´ecification C, entiers machines, flottants, pointeurs, . . . )
couverture totale du contrˆole et des donn´ees
les propri´et´es d´emontr´ees par l’analyseur sont vraies de toutes les ex´ecutions
=⇒aucune erreur n’est oubli´ee :pas de faux n´egatif la sˆuret´e estimpos´eepar le standard DO-178
L’analyseur statique Astr´ee
L’analyseur statique Astr´ ee
L’analyseur statique Astr´ ee
Analyseur statique de programmes temps-r´eelsembarqu´es
d´evelopp´e `a l’ENS(2001–2009)
B. Blanchet, P. Cousot, R. Cousot, J. Feret, L. Mauborgne, D. Monniaux, A. Min´e, X. Rival industrialis´e et commercialis´e parAbsInt
(depuis 2009)
Astr´ ee
www.astree.ens.fr
AbsInt
www.absint.com
L’analyseur statique Astr´ee
L’analyseur statique Astr´ ee
L’analyseur statique Astr´ee
Analyseur statique sp´ ecialis´ e
Principe :
1 Partir d’un analyseursimple, rapide, peu pr´ecis
avec un domaine exprimant les propri´et´es d’int´erˆet(e.g., intervalles)
et d’un programme caract´eristique dans la classe d’int´erˆet
2 Raffiner manuellementl’analyseur jusqu’`a atteindre 0 fausse alarme d´eterminer quelles propri´et´es interm´ediaires ne sont pas inf´er´ees ajouter un nouveau domaine abstrait
si la propri´et´e n’est pas d´ej`a exprimable
utilisation d’op´erateurs abstraits rapides et minimalistes,
limiter le p´erim`etre d’activation du domaine (variables, portions de programme) pour rester efficace
ou raffiner des op´erateurs abstraits dans les domaines existants ou ajouter des r´eductions entre domaines existants
ou raffiner les param`etres de pr´ecision
p´erim`etre d’activation, param`etres d’it´eration, . . .
L’analyseur statique Astr´ee
Analyseur statique sp´ ecialis´ e
Principe :
1 Partir d’un analyseursimple, rapide, peu pr´ecis
avec un domaine exprimant les propri´et´es d’int´erˆet(e.g., intervalles)
et d’un programme caract´eristique dans la classe d’int´erˆet
2 Raffiner manuellementl’analyseur jusqu’`a atteindre 0 fausse alarme d´eterminer quelles propri´et´es interm´ediaires ne sont pas inf´er´ees ajouter un nouveau domaine abstrait
si la propri´et´e n’est pas d´ej`a exprimable
utilisation d’op´erateurs abstraits rapides et minimalistes,
limiter le p´erim`etre d’activation du domaine (variables, portions de programme) pour rester efficace
ou raffiner des op´erateurs abstraits dans les domaines existants ou ajouter des r´eductions entre domaines existants
ou raffiner les param`etres de pr´ecision
p´erim`etre d’activation, param`etres d’it´eration, . . .
Analyseur statique sp´ ecialis´ e
R´esultat
analyseursˆurpar construction efficacepar parcimonie
0fausse alarme sur le programme cible encourage une conception modulaire et des abstractions r´eutilisables Justification th´eorique :
pour chaque programme et propri´et´e, un domaine ad´equat existe
mais sa construction effective n’est pas m´ecanisable
un domaine donn´e fonctionne sur un nombre infini de programmes toute combinaison finie de domaines ´echoue
sur un nombre infini de programmes
En pratique,un analyseur sera pr´ecis sur toute une classe de programmes La suppression des fausses alarmes au cas par cas n´ecessite un affinage des param`etres de pr´ecision (qui peut souvent ˆetre effectu´e par l’utilisateur)
L’analyseur statique Astr´ee
L’analyseur sp´ ecialis´ e Astr´ ee
Sp´ecialis´e pour :
l’analyse deserreurs `a l’ex´ecution
d´epassements arithm´etiques, d´epassements de tableaux, divisions par 0, etc.
les logicielsC embarqu´es critiques
pas d’allocation dynamique de m´emoire, pas de r´ecursivit´e
et en particulier les logiciels de contrˆole/commande
programmes r´eactifs, avec des calculs flottants intensifs structure de contrˆole simple, structures de donn´ees simples
lavalidation
toutes les erreurs sont trouv´ees, et peu de fausses alarmes
Environ40 domaines abstraitssont utilis´es simultan´ement
Logiciels de contrˆ ole/commande synchrones
Code r´eactif con¸cu dans un langage graphique, puis compil´e en C
(Scade, Simulink)
Structure
initialisation desvariables d’´etat while ( clock ≤ 3 600 000 ) {
lireles entr´ees des senseurs (volatile) calculerles sorties et lenouvel ´etat
´ecrireles sorties dans les actuateurs attendre le prochaintickd’horloge }
l’espace d’´etat globalest tr`es grand ('10Kvariables)
les structures de donn´ees restent simples (tableaux)
nombreuxcalculs num´eriques flottants (interpolation, filtrage digital)
la structure de contrˆole est tr`es plate
(l’inlining de appels de fonctions est possible)
L’analyseur statique Astr´ee
Diagramme de bloc : exemple de filtre digital
chaque bloc est une (petite) fonction C pr´ed´efinie une boˆıte a des variables d’´etat, r´emanentes (static) les entr´ees sont volatiles,
uniquement born´ees par des contraintes physiques(senseurs)
S´ emantique concr` ete d’Astr´ ee
S´emantique concr`ete : d´efinie par lanorme C99(programmes portables)
lanorme IEEE 754-1985(calculs en virgule flottante)
des param`etres sp´ecifiques `a chaque architecture
(sizeof, endianess,struct, etc.)
des param`etres du compilateur et du linker (initialisation, etc.)
Propri´et´es d’int´erˆet : absence d’erreur `a l’ex´ecution pas ded´epassement de capacit´een entier ni en flottant
pasd’op´eration arithm´etique invalide (/0,<<33)
pasd’acc`es de tableau ou de pointeur invalide respect des assertions introduites dans le programme
par le programmeur (assert)
i.e., l’inaccessibilit´e d’un ´etat de programme invalide
L’analyseur statique Astr´ee
S´ emantique apr` es une erreur
Plusieurs s´emantiques sont envisageablesapr`es une erreur: arrˆeterle programme (i.e., l’op´erateur retourne⊥)
division ou modulo par z´ero
d´epassement de capacit´e en flottant (selon la configuration du FPU)
´
echec d’unassert retourner une valeur arbitraire
(non d´eterminisme dans l’ensemble des valeurs autoris´ees par le type)
d´ecalage de bit invalide r´esultat bien d´efini
arithm´etique modulo 2n en entiers non sign´es type-punning
(r´e-interpr´etation d’un motif de bits comme une valeur d’un autre type)
comportement totalement ind´efini acc`es m´emoire invalide
=⇒trait´e comme un arrˆet de programme
Certains comportements peuvent ˆetre param´etr´es par l’utilisateur Toujours continuer l’analyse apr`es une alarme si cela a un sens !
Vue g´ en´ erale de l’analyseur
pr´e-processeur C (cpp)
↓
analyse lexicale C99
↓
´edition de lien(linker)au niveau source
↓
g´en´eration de code interm´ediaire et typage
↓
propagation des constantes et simplification du code
↓
analyse de d´ependances
↓
interpr`ete abstrait
nombreux points communs avec lefront-endd’un compilateur
L’analyseur statique Astr´ee
L’interpr` ete abstrait d’Astr´ ee
↓
it´erateur sur la syntaxe
↓
domaine de partitionnement de traces l
domaine de structure m´emoire l
domaine de pointeurs l
(produit r´eduit de)domaines abstraits num´eriques
l l l l ...
intervalles octogones arbres de d´ecisions filtres . . .
Quelques domaines abstraits utilis´ es dans Astr´ ee
octogones congruences arbres de d´ecision bool´eens
±X±Y ≤c X≡a[b] disjonctions
[Min´e 2006] [Granger 1989] [Mauborgne]
–100 –80 –60 –40 –20 0 20 40 60 80 100
y
–100 –80–60–40–20 20406080100 x
ellipso¨ıdes exponentielles partitionnement de traces
filtres digitaux X≤(1 +α)βt disjonctions
[Feret 2005] [Feret 2005] [Mauborgne Rival 2005]
L’analyseur statique Astr´ee
Exemple : paquets d’octogones
Invariants :∧ij±Xi±Xj ≤cij; coˆutcubique
Un coˆutO(|V|n) avecn>1 est trop ´elev´e en pratique
Solution
Ne pas mettre toutes les variablesVdans ununique octogone Cr´eer `a la place de nombreuxpetits “paquets” d’octogones:
d´etermin´es par unepr´e-analyse de d´ependance
ne relier dans un octogone que les variables modifi´ees ensemble interrompre les chaˆınes de d´ependances aux fronti`eres des blocs syntaxiques (limiter la clˆoture transitive)
R´esultat : sur le type de programmes consid´er´es
nombre d’octogones lin´eaire en|V|et donc|P| (taille du programme)
taille des octogones constante, petite ('4)
=⇒coˆut lin´eaire en pratique
Exemple : paquets d’octogones
Invariants :∧ij±Xi±Xj ≤cij; coˆutcubique
Un coˆutO(|V|n) avecn>1 est trop ´elev´e en pratique
Solution
Ne pas mettre toutes les variablesVdans ununique octogone Cr´eer `a la place de nombreuxpetits “paquets” d’octogones:
d´etermin´es par unepr´e-analyse de d´ependance
ne relier dans un octogone que les variables modifi´ees ensemble interrompre les chaˆınes de d´ependances aux fronti`eres des blocs syntaxiques (limiter la clˆoture transitive)
R´esultat : sur le type de programmes consid´er´es
nombre d’octogones lin´eaire en|V|et donc|P| (taille du programme)
taille des octogones constante, petite ('4)
=⇒coˆut lin´eaire en pratique
L’analyseur statique Astr´ee
Exemple : arbres de d´ ecision bool´ eens
Le flot de contrˆole est souvent encod´e dans desvariables bool´eennes Exemple
B = (X>0);
..
. code long ..
.
if (B) Y = 1/X;
(B = 1∧X >0)∨(B= 0∧X ≤0)non convexe
Il est n´ecessaire departitionnerX par rapport `a lavaleur deB
Exemple : arbres de d´ ecision bool´ eens
0
0 1 0 1
1
X Y X
Y
X Y B B1
B2
BDD 2
Numeric abstract domains
BDD : structure compactepour le partitionnement d’´etats variablesbool´eennes aux nœuds
domaines num´eriques aux feuilles(intervalles, octogones)
partage des sous-arbres identiques⇒meilleur efficacit´e Mais il y a trop de variables bool´eennes pour un seul arbre :
utiliser ungrand nombre d’arbres de petite taille(profondeur 3)
utiliser un crit`ere syntaxique pour choisir les variables `a relier
L’analyseur statique Astr´ee
Exemple : filtrage num´ erique
filter.c int INIT = 1;
float P, X, E1,E2, S1,S2;
void filtre2(){ if (INIT) {
P = S1 = E1 = X;
} else {
P = (0.4677826 * X) -
(E1 * 0.7700725) + (E2 * 0.4344376) + (S1 * 1.5419) - (S2 * 0.6740477);
} E2 = E1;
E1 = X;
S2 = S1;
S1 = P;
}
void main() { while (1) {
X = input(); /* [-10,10] */
filtre2();
INIT = input(); /* [0,1] */
wait_tick();
} }
Exemple : filtrage num´ erique
calcul deXn=
αXn−1+βXn−2+Yn
In
aucunintervalle ou poly`edre n’est stable la surface stable la plus simple est uneellipse Y2−aYX−bX2≤c
X U F(X) X
F(X)
F(X) X
X U F(X)
intervalle instable ellipse stable
L’analyseur statique Astr´ee
Exemple : calculs flottants
Nombres flottants :
cause d’erreurs additionnelles: d´epassements de capacit´e arrondi : sˆuret´e sur les r´eels6=⇒ sˆuret´e sur les flottants
e.g. :if (x != 0) y = 1 / (x*x)
Rendre les domaines sˆurs sur les flottants : Intervalles
faciled’ˆetre sˆur :arrondi vers l’ext´erieur [a,b]⊕[c,d] def= [a⊕−∞c,b⊕+∞d]
Domaines relationnels (octogones, poly`edres)
donner une s´emantiquedans les r´eelspar transformation d’expressions enajoutant explicitement l’effet de l’arrondi:
X⊕Y −→[1−,1 +]X+ [1−,1 +]Y+ [−ε, ε] (abstraction)
passer ces expressions r´eelles `a undomaine sˆur pour les r´eels le domaine lui-mˆeme peut ˆetreimplant´e de mani`ere sˆure en flottants
(X+Y≤c)∧(−Y ≤d) =⇒ (X≤c⊕+∞d) (arrondi vers l’ext´erieur)
L’analyseur statique Astr´ee
Exemple : calculs flottants
Nombres flottants :
cause d’erreurs additionnelles: d´epassements de capacit´e arrondi : sˆuret´e sur les r´eels6=⇒ sˆuret´e sur les flottants
e.g. :if (x != 0) y = 1 / (x*x)
Rendre les domaines sˆurs sur les flottants : Intervalles
faciled’ˆetre sˆur :arrondi vers l’ext´erieur [a,b]⊕[c,d] def= [a⊕−∞c,b⊕+∞d]
Domaines relationnels (octogones, poly`edres)
donner une s´emantiquedans les r´eelspar transformation d’expressions enajoutant explicitement l’effet de l’arrondi:
X⊕Y −→[1−,1 +]X+ [1−,1 +]Y+ [−ε, ε] (abstraction)
passer ces expressions r´eelles `a undomaine sˆur pour les r´eels le domaine lui-mˆeme peut ˆetreimplant´e de mani`ere sˆure en flottants
(X+Y≤c)∧(−Y ≤d) =⇒ (X≤c⊕+∞d) (arrondi vers l’ext´erieur)
L’analyseur statique Astr´ee
Exemple : calculs flottants
Nombres flottants :
cause d’erreurs additionnelles: d´epassements de capacit´e arrondi : sˆuret´e sur les r´eels6=⇒ sˆuret´e sur les flottants
e.g. :if (x != 0) y = 1 / (x*x)
Rendre les domaines sˆurs sur les flottants : Intervalles
faciled’ˆetre sˆur :arrondi vers l’ext´erieur [a,b]⊕[c,d] def= [a⊕−∞c,b⊕+∞d]
Domaines relationnels (octogones, poly`edres)
donner une s´emantiquedans les r´eelspar transformation d’expressions enajoutant explicitement l’effet de l’arrondi:
X⊕Y−→[1−,1 +]X+ [1−,1 +]Y+ [−ε, ε] (abstraction)
passer ces expressions r´eelles `a undomaine sˆur pour les r´eels le domaine lui-mˆeme peut ˆetreimplant´e de mani`ere sˆure en flottants
(X+Y ≤c)∧(−Y ≤d) =⇒ (X≤c⊕+∞d) (arrondi vers l’ext´erieur)
Exemple : exponentielles
round.c void main() {
float X = input(); /* [0,100] */
while (1) { X = X / 101.;
...
X = X * 101.;
wait_tick();
} }
Probl`eme :
En flottant (X/101)×1016=X.
×et/ajoutent uneerreur d’arrondi;X peut croˆıtre un peu `a chaque it´eration
=⇒la borne deX croˆıtexponentiellement!
En pratique, la croissance est suffisammentlenteet la dur´ee d’ex´ecution petite pour assurer qu’il n’y apas de d´epassement de capacit´e
Solution :
Domainerelationnel non lin´eairepour relierX ettick
|X| ≤α(1 +a)tick+β (α,βetasont automatiquement inf´er´es)
R´eduction:tick≤MAX_TICK⇒borne surX
L’analyseur statique Astr´ee
Exemple : mod` ele m´ emoire bas niveau
Type union union {
struct { uint8 al,ah,bl,bh } b;
struct { uint16 ax,bx } w;
} r;
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
Type-punning
uint8 buf[4] = { 1,2,3,4 };
uint32 i = *((uint32*)buf);
Copie rapide float a,b;
*((int*)&a) = *((int*)&b);
Norme C : programmes mal typ´es, comportementsind´efinis En pratique :
il n’y apas d’erreur
la s´emantique estbien d´efinie (sp´ecification de l’ABI)
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
Principe : s´emantique concr`ete
d´ecouper la m´emoire encellulesrepr´esentant un entier de 1 octet ou plus ajouter (et supprimer)dynamiquementles cellules `a l’ex´ecution
en fonction des acc`es par pointeur
un octet peut ˆetre couvert parplusieurs cellules
=⇒conjonctionde contraintes
=⇒possibilit´e desynth´etiserla valeur d’une nouvelle cellule
`
a partir des cellules d´ej`a pr´esentes tout octet n’est pas forc´ement couvert (>)
L’analyseur statique Astr´ee
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
´etat initial : pas de cellule (>)
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
ax 258
cr´eer r.w.ax: celluleuint16`a l’offset 0
L’analyseur statique Astr´ee
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
ax 258 al
2
cr´eer r.b.al: celluleuint8`a l’offset 0 initialis´ee avec :r.w.ax mod 256
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
al 3
modifier la celluler.b.al d´etruire la cellule invalider.w.ax
L’analyseur statique Astr´ee
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
ax
al
0,...,65535
2,3
mat´erialiser les cellules de toutes les branches et faire l’union des environnements possibles
Exemple : mod` ele m´ emoire bas niveau
Type union
r.w.ax = 258;
if (r.b.al==2) r.b.al++;
0 1 2 ...
ax
al
0,...,65535
2,3
Dans l’abstrait : associer `a chaque cellule
un intervalle qui sur-approxime l’ensemble de ses valeurs possibles ou, plus g´en´eralement, une dimension dans un domaine num´erique
e.g. poly`edres, pour garder des relations entre cellules
L’analyseur statique Astr´ee
Applications d’Astr´ ee
Airbus A340-300(2003) Airbus A380(2004)
(mod`ele de)ESA ATV(2008)
taille : de 70 000 `a 860 000 lignes de C temps d’analyse : de 45mn `a'40h
0 alarme :preuve d’absence d’erreur `a l’ex´ecution
R´ esum´ e
Objectif atteint
Astr´ee : il estpossiblede construire un analyseur statique `a la fois : sˆurvis `a vis d’une s´emantique r´ealiste du C
raisonnablement efficaceen temps et en m´emoire pr´ecissur uneclasse infinie de programmes
utilisable dans un cadre devalidationdes logiciels critiques
Recette
partir d’un analyseur simple(intervalles)
tant qu’il reste des fausses alarmes chercher leur cause et, au choix
r´egler les param`etre d’analyse, ou am´eliorer un domaine existant, ou
ajouter une r´eduction entre domaines existants, ou ajouter un nouveau domaine
L’analyseur statique Astr´eeA
L’analyseur statique Astr´ eeA
Les logiciels concurrents
Programmation concurrente :
d´ecomposerun programme en un ensemble deprocessus qui interagissent exploitation du parall´elisme des ordinateurs(multi-cœurs, cloud)
d´ecomposition du programme en tˆaches asynchrones
(serveurs, GUI, programmes r´eactifs, . . . )
Dans l’avionique : Integrated Modular Avionics int´egrer des fonctionnalit´es(moins de CPUs)
remplacer les bus physiques par une m´emoire partag´ee (moins de fils)
pour les tˆaches moins critiques(DAL C–E, certification plus l´eg`ere)
allocationstatique des ressources(threads, locks, m´emoire)
ordonnancementtemps-r´eel(ARINC 653, POSIX threads real-time)
Difficult´es :
les logiciels concurrents sont plus difficiles `a concevoir correctement etplus difficiles`avalideret `av´erifier
le testestinefficace,
lesm´ethodes formelles d’analyse de source sont peu d´evelopp´ees
L’analyseur statique Astr´eeA
S´ emantique informelle des programmes multi-thread
t1 t2
`1awhiletruedo `1bwhiletruedo
`2aifx<y then `2bify <100then
`3ax←x+ 1 `3by ←y+rand(1,3)
Mod`ele d’ex´ecution :
ensemble fini dethreads (logiciels embarqu´es)
la m´emoire est partag´ee(x,y)
chaque thread a son propre compteur de programme l’ex´ecution entrelace des pas de chaque threadt1andt2
en choisissantarbitrairementla prochaine thread `a ex´ecuter
(les affectations et les tests sont consid´er´es comme atomiques)
=⇒nous avons l’invariant global :0≤x ≤y ≤102
Retour sur l’analyse s´ equentielle
Deux m´ethodes d’analyse : Equationnelle :´
X1=>
X2=F2(X1) X3=F3(X1) X4=F4(X3,X4)
D´enotationnelle :
i = 0;
while (i < nb) { a[i] =12;
i++;
}
CJwhilecdobdoneKX def=
CJ¬c?K(lfpλY.X∪CJb?K(CJcKY)) CJifcthentfiKX def=
CJtK(CJc?KX)∪CJ¬c?KX . . .
d´eriver un syst`eme d’´equations du CFG une variableXi∈ D]par point de programmei it´erer (propager) le long du CFG
m´emoire lin´eaire en latailledu programme strat´egie de propagationflexible
facile `a adapter aux programmesconcurrents avec un produit de CFG
m´ethode vue en cours et en TME it´eration sur la structure syntaxique
m´emoire lin´eaire en laprofondeurdu programme strat´egie d’it´erationfix´ee
(suit la structure du programme)
pas de d´efinition inductive du parall´elisme. . .
L’analyseur statique Astr´eeA
M´ ethode ´ equationnelle (exemple)
`1whiletruedo
`2ify <100then
`3y ←y+rand(1,3)
Syst`eme d’´equations : X1={[y 7→0]}
X2=X1∪CJy≥100KX2∪CJy ←y+rand(1,3)KX3
X3= CJy <100KX2
Le syst`eme est de la forme∀i∈ {1,2,3}:Xi=Fi(X1,X2,X3) et peut ˆetre r´esolu par it´erations :
∀i∈ {1,2,3}: Xi0=⊥
Xik+1=Fi(X1k,X2k,X3k)
Produit de CFG
× =
Produitdes CFG des threads du programme :
´
etat de contrˆole = paire de points de programmes
=⇒explosion combinatoiredes ´etats abstraits duplication des fonctions de transfert
=⇒exponentiel en le nombre de threads
L’analyseur statique Astr´eeA
Produit de CFG (exemple)
t1 t2
`1awhiletruedo `1bwhiletruedo
`2aifx<y then `2bify <100then
`3ax←x+ 1 `3by ←y+srand(1,3)
Syst`eme d’´equations :
X1a,1b={[x7→0,y7→0]}
X2a,1b=X1a,1b∪CJx≥yKX2a,1b∪CJx←x+ 1KX3a,1b X3a,1b= CJx<yKX2a,1b
X1a,2b=X1a,1b∪CJy≥100KX1a,2b∪CJy←y+rand(1,3)KX1a,3b X2a,2b=X1a,2b∪CJx≥yKX2a,2b∪CJx←x+ 1KX3a,2b∪
X2a,1b∪CJy≥100KX2a,2b∪CJy←y+rand(1,3)KX2a,3b
X3a,2b= CJx<yKX2a,2b∪X3a,1b∪CJy≥100KX3a,2b∪CJy←y+rand(1,3)KX3a,3b X1a,3b= CJy<100KX1a,2b
X2a,3b=X1a,3b∪CJx≥yKX2a,3b∪CJx←x+ 1KX3a,3b∪CJy<100KX2a,2b X3a,3b= CJx<yKX2a,3b∪CJy<100KX3a,2b
L’analyseur statique Astr´eeA
Analyse thread ` a thread avec interf´ erences simples
i = 0;
while (i < nb) { a[i] --;
i++;
}
i = 0;
while (i < nb) { a[i] ++;
i++;
}
Principe : ´eviter l’explosion combinatoire du contrˆole analyser chaque thread s´epar´ement
collecterlesvaleurs´ecrites dans chaque variable par chaque thread
=⇒lesinterf´erences
abstraites dans un domaine abstrait, e.g., les intervalles
r´e-analyserles threads, eninjectantces valeurs `a chaque lecture
lire une variable retourne la derni`ere valeur lue, ou une interf´erence, de mani`ere non d´eterministe
=⇒de nouveaux ´etats et interf´erences sont d´ecouverts it´erer les analyses jusqu’`a la stabilisation
en appliquant un ´elargissementOsur les interf´erences
L’analyseur statique Astr´eeA
Analyse thread ` a thread avec interf´ erences simples
i = 0;
while (i < nb) { a[i] --;
i++;
}
i = 0;
while (i < nb) { a[i] ++;
i++;
}
Principe : ´eviter l’explosion combinatoire du contrˆole analyser chaque thread s´epar´ement
collecterlesvaleurs´ecrites dans chaque variable par chaque thread
=⇒lesinterf´erences
abstraites dans un domaine abstrait, e.g., les intervalles
r´e-analyserles threads, eninjectantces valeurs `a chaque lecture
lire une variable retourne la derni`ere valeur lue, ou une interf´erence, de mani`ere non d´eterministe
=⇒de nouveaux ´etats et interf´erences sont d´ecouverts it´erer les analyses jusqu’`a la stabilisation
en appliquant un ´elargissementOsur les interf´erences
L’analyseur statique Astr´eeA
Analyse thread ` a thread avec interf´ erences simples
i = 0;
while (i < nb) { a[i] --;
i++;
}
i = 0;
while (i < nb) { a[i] ++;
i++;
}
Principe : ´eviter l’explosion combinatoire du contrˆole analyser chaque thread s´epar´ement
collecterlesvaleurs´ecrites dans chaque variable par chaque thread
=⇒lesinterf´erences
abstraites dans un domaine abstrait, e.g., les intervalles
r´e-analyserles threads, eninjectantces valeurs `a chaque lecture
lire une variable retourne la derni`ere valeur lue, ou une interf´erence, de mani`ere non d´eterministe
=⇒de nouveaux ´etats et interf´erences sont d´ecouverts
it´erer les analyses jusqu’`a la stabilisation
en appliquant un ´elargissementOsur les interf´erences
L’analyseur statique Astr´eeA
Analyse thread ` a thread avec interf´ erences simples
i = 0;
while (i < nb) { a[i] --;
i++;
}
i = 0;
while (i < nb) { a[i] ++;
i++;
}
... ...
▽ ▽
Principe : ´eviter l’explosion combinatoire du contrˆole analyser chaque thread s´epar´ement
collecterlesvaleurs´ecrites dans chaque variable par chaque thread
=⇒lesinterf´erences
abstraites dans un domaine abstrait, e.g., les intervalles
r´e-analyserles threads, eninjectantces valeurs `a chaque lecture
lire une variable retourne la derni`ere valeur lue, ou une interf´erence, de mani`ere non d´eterministe
=⇒de nouveaux ´etats et interf´erences sont d´ecouverts it´erer les analyses jusqu’`a la stabilisation
en appliquant un ´elargissementOsur les interf´erences
Exemple d’analyse thread ` a thread
t1
`1awhiletruedo
`2aifx<ythen
`3ax←x+ 1
t2
`1bwhiletruedo
`2bify <100then
`3by ←y+rand(1,3)
Analyse concr`ete det1
(1a):x=y = 0
(2a):x=y = 0
(3a):⊥
L’analyseur statique Astr´eeA
Exemple d’analyse thread ` a thread
t1
`1awhiletruedo
`2aifx<ythen
`3ax←x+ 1
t2
`1bwhiletruedo
`2bify <100then
`3by ←y+rand(1,3)
Analyse concr`ete det2
(1b):x =y = 0
(2b):x = 0,y∈[0,102]
(3b):x = 0,y∈[0,99]
interf´erences d´ecouvertes :y←[1,102]
Exemple d’analyse thread ` a thread
t1
`1awhiletruedo
`2aifx<ythen
`3ax←x+ 1
t2
`1bwhiletruedo
`2bify <100then
`3by ←y+rand(1,3)
Nouvelle analyse det1avec interf´erences caus´ees part2 interf´erences `a appliquer :y ←[1,102]
(1a):x=y = 0
(2a):x∈[0,102], y = 0
(3a):x∈[0,102], y = 0
remplacerx <y parx <max(y,[1,102]) remplacerx ≥y parx ≥min(y,[1,102])
interf´erences d´ecouvertes :x←[1,102]
les analyses suivantes sont identiques :le point fixe est atteint
L’analyseur statique Astr´eeA
Exemple d’analyse thread ` a thread
t1
`1awhiletruedo
`2aifx<ythen
`3ax←x+ 1
t2
`1bwhiletruedo
`2bify <100then
`3by ←y+rand(1,3)
Invariants concrets :
nous avonsx,y ∈[0,102], mais pasx ≤y Analyse abstraite d´eriv´ee :
similaire `a une analyse deprogrammes s´equentiels, mais it´er´ee
param´etr´ee par un domaine abstrait arbitraire
efficace(peu de r´e-analyses n´ecessaires en pratique)
les interf´erences sontnon relationnellesetinsensibles au flot de contrˆole
limite h´erit´ee de la s´emantique concr`ete
Mod` ele de m´ emoire mat´ eriel : TSO
buffer2
mémoire partagée x ← 1
y ← 12 x ← 5 x ← 10
x=0 y=99 x ← 1 y ← 12 x ← 5 x ← 10 buffer1
thread1 thread2
Total Store Ordering :mod`ele d’Intel x86 chaque thread a une queue non relationnelles les queues sont vid´ees de mani`ere non d´eterministe dans la m´emoire partag´ee
une thread lit en priorit´e les valeurs pr´esentes dans sa queue, ou la m´emoire partag´ee si aucune valeur n’est disponible
L’analyseur statique Astr´eeA
M´ emoires faiblement coh´ erentes et sˆ uret´ e
La s´emantique d’entrelacements(coh´erence s´equentielle)
n’est doncpas r´ealiste:
optimisations du CPU(buffers, r´e-ordonnancement d’instructions)
optimisations du compilateur (explicitement permises par la norme)
=⇒
une analyse sˆure pour la coh´erence s´equentielle
n’est pas automatiquement sˆure pour un mod`ele m´emoire r´ealisteplus faible
mod`ele plus faible = moins de garanties = plus de comportements possibles exemple : y←1;ifx= 0then · · · ||x←1;ify= 0then · · · peut ˆetre ex´ecut´e comme : ifx= 0theny←1;· · · ||ify= 0thenx←1;· · ·
R´esultat : l’analyse avec interf´erences simplesest sˆure
vis `a vis d’un grand nombre de mod`eles m´emoires faibles
Justification : les interf´erences non relationnelles et insensibles au flot de contrˆole sont invariantes par r´e-ordonnancement des lectures et ´ecritures
Verrous d’exclusion mutuelle
t1
t2 lock
lock unlock
unlock
W
R R R
W W W
Mutexes :
assure l’exclusion mutuelle
`
a tout instant, au plus une thread peut poss´eder un verrou donn´e
assure la coh´erence de la m´emoire, l’atomicit´e et la propagation des ´ecritures
pas de r´e-ordonnancement `a traverslocketunlock
=⇒nous pouvonssupprimer des interf´erences irr´ealisableset am´eliorer la pr´ecision en ajoutant un petite degr´e desensibilit´e au flot de contrˆole
L’analyseur statique Astr´eeA
Verrous d’exclusion mutuelle
t1
t2 lock
lock unlock
unlock
W
R R R
W W W
Interf´erences dedata-race:
paireslecture/´ecritureet´ecriture/´ecriturenon prot´eg´ees
Verrous d’exclusion mutuelle
t1
t2 lock
lock unlock
unlock
W
R R R
W W W
Interf´erences dedata-race:
paireslecture/´ecritureet´ecriture/´ecriturenon prot´eg´ees Interf´erences bien synchronis´ees :
la derni`ere´ecritureavant ununlockdet1
influence leslecturesentrelocket la premi`ere´ecrituredanst2
Nous partitionnons lesinterf´erencesen fonction de l’´etat des mutex.
L’analyseur statique Astr´eeA
Exemple
producteur consommateur (abstrait)
N consommateurs N producteurs
whiletruedo whiletruedo
lock(m) lock(m);
ifx>0thenx←x−1endif; x ←x+ 1;
ifx >100thenx←100endif;
unlock(m) unlock(m)
En supposantN producteurs etN consommateurs :
pas d’interf´erence dedata-race (preuve d’absence de data-race)
interf´erences bien synchronis´ees : consommateurs :x ←[0,99]
producteurs :x ←[1,100]
=⇒nous trouvons :x∈[0,100]
(sans lock, pourN>1, mˆeme la s´emantique concr`ete ne peut pas bornerx)
Ordonnanceur temps r´ eel ` a priorit´ e
yield yield
yield
yield priority
Ordonnanceur temps r´eel :
chaque thread a une priorit´e stricte(pouvant ˆetre dynamique)
une thread peut ˆetre pr´eempt´ee
uniquement par une thread de priorit´e strictement plus ´elev´ee une thread peut se suspendre pour un temps ind´etermin´e(yield,lock)
Analyse :affiner les propagation d’interf´erences en tenant compte des priorit´es partitionnement des interf´erences par thread et par priorit´e
les threads deplus haute priorit´einjectent les interf´erences depuis leur yieldvers tous les points des threads
les threads deplus basse priorit´einjectent leurinterf´erence de data-race vers les points deyield
L’analyseur statique Astr´eeA
Analyse de deadlocks
Deadlock: cycle de threads bloqu´es
chacun attendant un mutex poss´ed´e par le suivant
t1 t2
lock(a) lock(a) lock(c) lock(b) unlock(c) unlock(a) lock(b) lock(a) unlock(b) unlock(a) unlock(a) unlock(b)
t1
t1 a
t1 a,b
t2
t2 b t2
b,a a
b a
t2
a a
b t1
a,c c
Pendant l’analyse, collecter :
lesconfigurationsR de mutexpossibles :R⊆threads× P(mutexes) lesinstructions de lock depuis ces configurationsR×mutexes
Ensuite, construire ungraphe de blocageentreinstructionslock ((t,m), `) bloque ((t0,m0), `0) si
t 6=t0 etm∩m0 =∅ (configurations non en exclusion mutuelle)
`∈m0 (lockbloquant)
Un deadlock est uncycle dans le graphe des blocages
g´en´eralisation possible aux cycles plus grands, avec plus de threads intervenants dans le deadlock
Analyse de deadlocks
Deadlock: cycle de threads bloqu´es
chacun attendant un mutex poss´ed´e par le suivant
t1 t2
lock(a) lock(a) lock(c) lock(b) unlock(c) unlock(a) lock(b) lock(a) unlock(b) unlock(a) unlock(a) unlock(b)
lock(b) blocks lock(a) blocks lock(a) blocks t1
t1 a
t1 a,b
t2
t2 b t2
b,a a
b a
t2
a a
b
t1
a,c c
Pendant l’analyse, collecter :
lesconfigurationsR de mutexpossibles :R⊆threads× P(mutexes) lesinstructions de lock depuis ces configurationsR×mutexes Ensuite, construire ungraphe de blocageentreinstructionslock
((t,m), `) bloque ((t0,m0), `0) si
t 6=t0 etm∩m0 =∅ (configurations non en exclusion mutuelle)
`∈m0 (lockbloquant)
Un deadlock est uncycledans le graphe des blocages
g´en´eralisation possible aux cycles plus grands, avec plus de threads intervenants dans le deadlock
L’analyseur statique Astr´eeA
Interpr` ete abstrait d’Astr´ eeA
it´erateur sur les threads
↓
it´erateur sur la syntaxe
↓
domaine de partitionnement de traces
↓
domaine de partitionnement des verrous l
domaindestructurem´emoire
l ↑
domaine des interf´erences ...
l ↓
domaine de pointeurs l
(produit r´eduit de)domaines num´eriques abstraits
l l l l ...
intervalles octogones arbres de d´ecision filtres . . .
Famille cible d’applications
Mod`ele de concurrence : ensemble fix´e de threads
ordonnancement temps r´eel pr´eemptif sur un seul processeur m´emoire partag´ee, locks
Application cible :
code avionique embarqu´e 1.6 Mlocde C,15threads
code r´eactif+ coder´eseau+listes,chaˆınes,pointeurs
nombreuses variables, tableaux, boucles, graphe d’appel peu profond pas d’allocation dynamique de m´emoire, pas de r´ecursivit´e
L’analyseur statique Astr´eeA
Contexte d’analyse
Environnement d’ex´ecution concret :
Application cible C Autres applications ARINC 653 OS, C+asm
Mat´eriel
L’application cible :
s’ex´ecute en concurrence avec d’autres applications (s´eparation en m´emoire)
interagit dynamiquement avec un OSde type ARINC 653
(contrˆole des threads, mutex lock et unlock, communications)
interagit avec d’autres applications via l’OS
cr´ee des objets syst`emes seulement pendant la phase d’initialisation
(l’ensemble des objets cr´e´e est inf´er´e par l’analyse de la phase d’initialisation)
Contexte d’analyse
Environnement d’analyse abstraite :
Application cible, C mod`ele ARINC 653, C + built-in
L’application cible est enrichie avec unmod`ele de l’OS´ecrit `a la main 2.6 Kloc de C + built-ins Astr´ee bas niveau
simule tous les appels syst`emes de l’OS
implante les objets de l’OS avec des objets bas-niveau d’Astr´eeA
(e.g., les mutex d’Astr´eeA sont de simples entiers, ceux d’ARINC 653 ont un nom chaˆıne)
=⇒ r´eduction `a l’analyse d’un programme “C”autonome sans symbole ind´efini
L’analyseur statique Astr´eeA
R´ esultats
Pr´ecision : obtenus par sp´ecialisation 2010 :12,257fausses alarmes 2015 :1,195fausses alarmes Efficacit´e :
sur une machine Intel i7 2.90 GHz temps de calcul :24h
nombre d’it´erations :6 (pas d’´elargissement n´ecessaire sur les interf´erences)
90 GBRAM
L’am´elioration de la pr´ecision est obtenue grˆace : au partitionnement des interf´erences par les verrous
`
a l’ajout d’interf´erences relationnelles(non vu en cours)
`
a l’ajout de domaine abstraits sp´ecialis´es au domaine d’application