• Aucun résultat trouvé

Propriétés de multi-ensemble

Nous nous intéressons maintenant à la classe des propriétés d’agrégation concernant les multi-ensembles des valeurs d’un fragment.

8.2.1 Notations

Un multi-ensemble est caractérisé par une fonction appeléemultiplicité. À toute valeur, elle associe le nombre de fois où cette valeur apparaît dans le ensemble. On confond le multi-ensemble avec sa multiplicité et pour un multi-multi-ensembleM, on noteM(x) la multiplicité de la valeur xdansM. Nous considérons ici desmulti-ensembles hybrides[Syr01], qui généralisent les multi-ensembles classiques en autorisant des multiplicités négatives.

L’addition et la soustraction notées⊕et de deux multi-ensembles se calculent respective-ment par l’addition et la soustraction valeur par valeur des fonctions de multiplicité :

M ⊕ M0(x)=M(x)+M0(x) M M0(x)=M(x)− M0(x)

Pour tout tableauAon noteraAble multi-ensemble de ses valeurs, c’est à dire b A(x)=X i δx,A[i] oùδx,A[i] =        1 six=A[i] 0 sinon

8.2.2 Domaine des égalités linéaires de multi-ensembles

L’objectif initial du domaine des égalités linéaires de multi-ensembles [PH10] était de décou-vrir automatiquement des propriétés de permutations dans les tableaux. C’est un enjeu important dans la preuve des algorithmes de tris : il faut pouvoir prouver que le tableau initial est une per-mutation du tableau final. Non seulement l’ensemble des valeurs du tableau initial doit être le même que celui du tableau final, mais également le ensemble de ces valeurs. La multi-plicité des valeurs est importante. Si on note Ab0 le multi-ensemble des valeurs initiales (avant l’exécution de l’algorithme de tri) du tableauA, on doit prouver :

b

A= Ab0

En général, la preuve d’une telle propriété nécessite de pouvoir exprimer des propriétés un peu plus générales. En effet, beaucoup d’algorithmes de tris utilisant des échanges de cellules, comme celui là :

x ← A[i]

A[i] ← A[j]

A[j] ← x

La propriété de permutation précédemment citée n’est pas valide tout le temps de l’échange. Après l’affectation àA[i], la valeur deA[j] a été dupliquée dans le tableau, tandis que la valeur de A[i] encore stockée dans x a été retirée. En termes de multi-ensembles, on peut dire que le multi-ensemble des valeurs deAest celui des valeurs deA0auquel on a ajouté une nouvelle fois la valeur contenue dansA[j] et retiré la valeur contenue dansx. On exprimera ça à l’aide d’une équation linéaire de multi-ensembles :

b

A= Ab0⊕ {{A[j]}} {{x}}

Deux domaines sont proposés dans [PH10] pour la représentations de telles équations. Seul l’un d’entre eux conviendra à notre usage. L’idée est de considérer ces équations comme des équations affines générales et donc de réutiliser le treillis des équations affines. (Cf. section 2.3.1) Dans ces équations, les termes peuvent être

• des multi-ensembles des valeurs (initiales) d’un tableau

• des multi-ensembles singletons contenant la valeur d’une variable du programme • des multi-ensembles singletons contenant la valeur d’un élément de tableau • des multi-ensembles singletons contenant une constante

On conserve les caractéristiques du treillis des équations affines. Le treillis étant de profondeur finie, il n’est pas nécessaire d’utiliser un opérateur d’élargissement. La comparaison et le calcul de la borne supérieure reposent sur l’algorithme d’union linéaire [Kar76].

La sémantique abstraite de ce domaine interprète les affectations aux cellules de tableau par deux effets. D’une part, les multi-ensembles singletons sont affectés comme des variables clas-siques, soit fortement, soit faiblement, selon le cas. D’autre part, les multi-ensembles des valeurs d’un tableau sont affectés de la manière suivante. Pour une affectation àA[i]

• si on a dans le système d’équations une égalitéA[i]= exp, alors l’affectation est inversible et on substitueAbparAb⊕ {{x}} {{A[i]}};

• si on n’a pas de telle égalité, l’affectation n’est pas inversible et on est contraint de retirer

b

Adu système.

8.2.3 Application aux fragmentations

On souhaite étendre le domaine des équations linéaires de multi-ensembles. On veut qu’il puisse exprimer des propriétés à propos des multi-ensembles, non plus des valeurs d’un tableau, mais des valeurs de fragments de ce tableau, désignés par une fragmentation. Ceci consiste d’une part à interpréter les transformations élémentaires de la fragmentation et d’autre part à étendre la sémantique abstraite.

Introduction et retrait de fragment Les introductions et retraits de fragments sont traduits par l’introduction et retrait des variables représentant les multi-ensembles de ces fragments. Si le fragment introduit est vide, on ajoutera l’équation affirmant que la variable correspondante est égale au multi-ensemble vide. Dans le cas contraire, il n’y a rien à dire sur la variable, et elle n’apparaîtra dans aucune équation du système. Le retrait d’une variable utilise l’algorithme classique de projection permettant d’éliminer une variable d’un système linéaire en conservant le maximum d’information possible.

Compositions et décompositions Le domaine des équations linéaires de multi-ensemble permet de traiter les compositions et décompositions de manière exacte. Si les fragments f1et f2

sont composés en f3ou si f3est décomposé en f1et f2, on introduira dans le système l’équation

bf1⊕bf2= bf3

où bf1, bf2 et bf3 sont les multi-ensembles des valeurs des fragments f1, f2et f3. Il n’y a aucune différence entre les effets de la composition et ceux de la décomposition.

Fusion et fission Si un fragment f1est fusionné ou fissionné en un fragmentf2, on introduira dans le système l’équation

bf1 = bf2

Ici encore, il n’y a aucune différence entre les effets de la fusion et ceux de la fission.

Sémantique abstraite Les affectations fortes influencent les fragments sous scalaires comme dans le cas [PH10]. L’affectation faible en revanche aura des effets différents selon le cas :

• s’il s’agit d’une affectation à l’une des cellules d’un fragment qui n’est pas sous-scalaire, on peut appliquer la subtistution

• s’il s’agit d’une affectation à une cellule qui suivant les états n’appartient pas toujours au fragment, alors, sauf cas particulier1 on n’a pas d’autre choix que de retirer la variable faiblement affectée du système.

1. Le cas particulier, c’est quand le fragment affecté a une valeur constante et égale à la valeur affectée, auquel cas l’affectation faible est sans effet. Un exemple d’échange de cellule où ce cas intervient est donné dans [PH10].

Conclusion L’effort nécessaire pour pouvoir découvrir des équations linéaires sur les multi-ensembles des valeurs des fragments d’une fragmentation est très faible. Cette méthode a été implémentée et testée avec succès sur deux exemples simples : l’exemple de la copie de tableau et celui du partitionnement d’un tableau selon le signe.2

Pour clore ce chapitre, nous détaillons le déroulement de l’analyse du premier, l’exemple de la copie de tableau.

i←1

Tant quei≤nfaire

B[i]←A[i]

i←i+1

On rentre initialement dans la boucle avec un ensemble vide d’équations de multi-ensembles. Pour traiter l’affectation deA[i] àB[i] le domaine de fragmentation introduit ces deux singletons. On ne sait encore rien d’eux, mais puisqu’ils sont singletons, le domaine abstrait des multi-ensembles peut traiter l’affectation comme une affectation forte classique dont on déduit notre première équation de multi-ensembles

n d

A[i]= Bd[i]

De retour en tête de boucle, l’unification des fragmentations transformera les tranchesA[i−1] etB[i−1] enA[1..i[ etB[1..i[. Pour le système d’équations revenant de l’itération précédente, il ne s’agit que d’un renommage. En revanche, en entrée de boucle, on a un système d’équations vide dans lequel il faut introduire les nouvelles variables. Ces deux tranches sont vides lorsque

i = 0. On ajoute donc les équationsA[[1..i[ = ∅etB[[1..i[ = ∅. On doit ensuite calculer l’union linéaire des deux systèmes :

n [ A[1..i[=B[[1..i[ t        [ A[1..i[=∅ d B[i]=∅ n [ A[1..i[= B[[1..i[

Lors de l’itération suivante, on ajoutera une nouvelle fois les variables ˆA[i] et ˆB[i] et on concluera à leur égalité. Le système à ce point de l’analyse sera

       d A[i]=Bd[i] [ A[1..i[= B[[1..i[

Après l’affectation, il faut composer les tranches A[1..i[ et A[i] et les tranches B[1..i[ et B[i]. Nous détaillons d’abord la première. Pour traiter la composition de A[1..i[ etA[i] enA[1..i], et étant donné que ces tranches sont bien disjointes, on ajoute l’équationA[[1..i]= A[[1..i[⊕Ad[i] au système qui devient

             [ A[1..i]=A[[1..i[⊕Ad[i] d A[i]=Bd[i] [ A[1..i[= B[[1..i[

2. L’exemple du partionnement de tableau selon le signe ne pouvant pas être analysé avec la combinaison de notre critère de fragmentation et des diagrammes de tranches, (Cf section 10.2.3) une autre méthode de partitionnement a été utilisée.

Suivant le critère, les tranchesA[1..i[ etA[i] seront retirées ou bien directement après la compo-sition ou bien plus tard. Sur cet exemple, cela n’aura pas de conséquences. Le retrait des tranches entraîne l’élimination des variablesA[[1..i[ etAd[i] par l’algorithme de projection. Cela réduit le système à une seule équation.

n [

A[1..i]=B[[1..i[⊕Bd[i]

Puis, la composition deB[1..i[ etB[i] donnera directement

[

A[1..i]= B[[1..i[⊕Bd[i]=B[[1..i]

et l’élimination des deux tranches composantes nous donnera à nouveau

[

A[1..i]= B[[1..i]

Dans le domaine de l’analyse automatique de programmes, le cas des tableaux et des struc-tures de données est un sujet jeune dont l’essentiel des publications s’étale sur les douze der-nières années. Nous présenterons d’abord les travaux d’interprétation abstraite concernant la synthèse de propriétés de tableaux et de structures de données puis ceux concernant le choix et l’abstraction des fragmentations. La plupart des travaux présentés dans ces deux sections ont servi de point de départ à cette thèse. Dans une troisième section, nous présenterons plus rapi-dement diverses méthodes d’analyse statique semi-automatiques dont l’objectif n’est donc pas tout à fait le même, mais partageant des problématiques similaires.