• Aucun résultat trouvé

2.3 Interprétation abstraite

2.3.4 Choix du domaine abstrait

L’analyse statique par interprétation abstraite nécessite le choix d’un domaine abs- trait approprié. De nombreux domaines sont possibles pour représenter les espaces de valeurs entières des variables d’un programme, ou pour les adresses des accès en mémoire. Rival [89] détaille en 2011 plusieurs domaines numériques pour l’analyse sta- tique par interprétation abstraite. L’implémentation d’une variété de tels domaines

peut être mise à disposition dans des bibliothèques telles Apron [55]. Nous passons en revue quelques espaces numériques connus – des treillis – pour représenter des valeurs entières.

2.3.4.1 Intervalles

Le fonctionnement d’un domaine par intervalles [30] est simple : l’espace de valeurs de chaque variable est représenté par un couple (m, M) ∈ D#

I := (Z ∪ {−∞, +∞})2,

constitué des valeurs minimale et maximale que la variable peut prendre. Les fonctions d’abstraction et de concrétisation vers le domaine concret P(Z) sont immédiates : α(A) := [min(A), max(A)], et γ([m, M]) := [m, M]. Pour abstraire une fonction f : Z → Z dans ce domaine, on construit la fonction f# telle que

[m, M] ∈ DI#, f#([m, M]) := [min({f(x) | m < x < M}), max({f(x) | m < x < M})] Par exemple [m, M] + [m0, M0] = [m, M] t#[m0, M0] = [min(m, m0), max(m, M0)].

Le domaine des intervalles est convexe, concis et simple à manipuler. Il fait toutefois de grandes approximations, et manque d’efficacité pour représenter, par exemple, un couple d’entiers.

2.3.4.2 k-sets

Les k-sets sont des ensembles de valeurs de cardinalité maximale k. Ils sont classi- quement utilisés dans divers outils d’analyse statique (Jakstab [58] par exemple) pour leur efficacité à représenter des petits ensembles valeurs éparses (ce que les intervalles ne font pas efficacement). Le domaine abstrait est défini comme D#

k := {A ∈ P(Z) | |A| ≤

k} ∪ >. Lorsqu’un ensemble contient plus de k valeurs, il est représenté par > : ∀A ∈ P(Z), α(A) :=      A si |A| ≤ k > sinon ∀x ∈ D#k, γ(X) :=      > si X = > X sinon ∀x, x0 ∈ D#k, x t#x0 :=      x ∪ x0 si x 6= > ∧ x0 6= > ∧ |x ∪ x0| ≤ k > sinon

Les k-sets sont cependant vite limités par leur taille fixe, et leur agrandissement (l’augmentation de k) s’accompagne d’une rapide augmentation de la complexité.

2.3.4.3 CLP

long t[N];

for(i = 0; i < N; i++) t[i] = 0;

Figure 2.10 –Accès à un

tableau dans une boucle Le domaine des Circular-Linear Progressions (CLP)

est une abstraction visant à représenter précisément un comportement fréquent dans l’évolution des valeurs de va- riables de programmes.

Un schéma très courant dans les programmes est ce- lui de l’accès à un tableau dans une boucle, comme dans l’exemple de la Figure 2.10. L’adresse de cet accès est gé-

néralement compris dans un intervalle entier [t, t + δ.(N − 1)] où t est l’adresse du premier élément accédé du tableau, δ la taille d’un élément, et N le nombre d’éléments du (sous-)tableau accédé (égal au nombre d’itérations). Cependant, il est possible de donner une description plus précise de l’ensemble des accès que cet intervalle. En effet, si les accès se font par pas de δ comme sur cet exemple (δ = 4 sur la Figure 2.10), leur domaine concret serait donc {t, t + δ, t + 2δ, . . ., t + (N − 1)δ}.

Les CLP permettent de représenter ce type d’ensemble de valeurs, qui ont tous le même reste après division par δ. Un CLP est composé d’un triplet (l, δ, m), corres- pondant (par concrétisation) à l’ensemble {l + δi | 0 ≤ i ≤ m} ⊆ Z. L’abstraction de fonctions arithmétiques ou bit à bit sur les CLP est assez délicate, mais est largement traitée et illustrée dans plusieurs publications, dont récemment par Källberg [56].

De multiples travaux sur le calcul du WCET utilisent les CLP pour l’interprétation abstraite du programme. Sen et Srikant [96, 95] détaillent l’abstraction de quelques opérations arithmétiques et s’en servent pour faire une analyse d’adresses sur le binaire, avant d’estimer un WCET par ILP. Le domaine des CLP est également utilisé pour l’analyse de code machine dans OTAWA ; il est jugé efficace pour la représentation de variables – notamment d’adresses – par Cassé, Birée et Sainrat [24] qui le démontrent par des expérimentations sur les benchmarks de Mälardalen. Les CLP sont également utilisés dans SWEET, leur implémentation est détaillée par Källberg [56] en 2014.

2.3.4.4 Polyèdres

Cousot et Halbwachs [32] utilisent le modèle d’interprétation abstraite pour détecter des relations linéaires entre variables d’un programme. Le domaine abstrait choisi pour représenter l’espace de valeurs des variables du programme est celui des polyèdres, dont les propriétés sont extensivement utilisées tout au long de l’analyse. Les techniques de programmation linéaire sont utilisées pour déterminer les sommets des polyèdres obtenus par conjonction de contraintes issues du programme.

Un polyèdre convexe de Rn peut être caractérisé par un système de contraintes

linéaires (parfois sous forme matricielle) ou par un système générateur, composé d’une base, d’un ensemble de rayons, et d’un ensemble de sommets. Cette représentation est plus puissante que celle des intervalles : on peut à tout moment obtenir des intervalles de valeurs pour une variable à partir de polyèdres, par projection.

Halbwachs développe largement le domaine des polyèdres convexes pour l’analyse de programmes dans sa thèse [49]. Lisper utilise ces résultats en 2003 pour développer une analyse de WCET paramétrique [65]. Les bornes de boucles sont dérivées automa- tiquement, des techniques améliorées par rapport à l’IPET classique sont utilisées pour permettre la paramétrisation du WCET, c’est-à-dire qu’il devient fonction d’un vec- teur de paramètres. Le système de contraintes ILP symboliques est résolu en utilisant une forme d’ILP paramétrique, appelée Parameter Integer Programming. Les poly- èdres convexes utilisés dans des états abstraits représentant les valeurs des variables du programme permettent de dériver des contraintes de flot paramétriques.

Une des limites toutefois de ce choix d’abstraction est la nécessité de maintenir la convexité à tout moment ; certaines techniques exigent même que les arêtes des polyèdres ne se coupent qu’à certains angles (60°, ...). L’union abstraite (t#) de deux

polyèdres entraînera parfois des surapproximations (en particulier s’ils sont disjoints) pour obtenir un plus grand polyèdre convexe qui contienne les deux. Les polyèdres ne sont pas non plus adaptés pour abstraire des ensembles tels ceux représentés par les CLP. Enfin, connaître l’ensemble des valeurs entières contenues dans un polyèdre sur un espace vectoriel Rn est un problème non-trivial qui peut accroître la complexité de

2.3.4.5 Conclusion

Les possibilités d’abstraction et leurs variations sont infinies. Nous en avons pré- senté les plus basiques ou classiques, mais nombre d’autres abstractions ont été utilisées pour l’analyse statique de programmes. Notamment, Bound-T [53], un outil de calcul de WCET travaillant directement sur le binaire, utilise l’arithmétique de Presburger, un sous-ensemble décidable de l’arithmétique entière. Plus récemment, en 2007, Antoine Miné développe le domaine des Matrices de Différence des Bornes, ou Difference-Bound Matrices (DBM) [70], et Péron et Halbwachs [82] l’étendent et proposent une applica- tion à l’analyse de programme.

2.3.5

Notre philosophie

Définir une abstraction adaptée aux objectifs d’une analyse de programmes est crucial pour optimiser son efficacité et sa complexité, et en définit une partie des ca- ractéristiques. Une abstraction simple et contraignante permet d’accélérer une analyse, mais les résultats risquent de souffrir des approximations engendrées. Une abstrac- tion utilisant des représentations plus puissantes, plus fines des valeurs du programme sera nécessairement plus coûteuse et complexe à manipuler, mais pourra découvrir des propriétés qui n’auraient pu être découvertes sans cela.

C’est en partant de ce constat que les travaux de cette thèse développeront une solution hybride, composée d’un domaine abstrait d’abord très général et puissant – un ensemble de contraintes majoritairement linéaires – mais difficile à manipuler, ensuite enrichi d’un domaine plus structuré, aisé à maintenir et facilitant l’extraction de certaines informations nécessaires à l’analyse de programmes, comme la position d’une donnée adressée dans la pile.