• Aucun résultat trouvé

Fragmentation par sous-approximation de prédicat

9.2 Critères de fragmentation et abstractions de fragmentations

9.2.3 Fragmentation par sous-approximation de prédicat

L’approche précédente consistait à deviner une bonne fragmentation des tableaux en observant la syntaxe du programme et à chercher les propriétés des fragments. Une approche opposée est de fixer les propriétés que l’on souhaite trouver et ensuite de chercher quels sont les fragments sur lesquels ces propriétés sont vraies.

Il s’agit de l’approche choisie dans [GMT08] où l’analyse est paramétrée par des modèles de propriétés à chercher. Par exemple, si on veut prouver qu’un tableau est trié, on demande à l’analyse de trouver des propriétés suivant le modèle

L’analyse doit alors trouver pour quels tableauxaetbet pour quels couples d’indicesαetβcette propriété est vraie. Quoique la formulation du problème soit différente, il s’agit bien du même problème : celui de la recherche d’une fragmentation adéquate.

Le principe général peut être décomposé en deux. D’une part, on réalise une analyse classique par interprétation abstraite sur le programme en s’autorisant à introduire temporairement des variables représentant une cellule de tableau, ou le champ d’un nœud d’une structure de donnée. D’autre part, tout au long de cette analyse, on extrait des valeurs abstraites les propriétés suivant les modèles de formules choisis. Typiquement, les propriétés qui concernent des cellules de tableaux ou de structures de données seront perdues avant une union. C’est donc un moment opportun pour chercher quelles sont celles qui vérifient les modèles de formule. On regardera dans la valeur abstraite quelles sont les variables qui valident chaque modèle de formule. Ceci implique qu’on ait choisit un modèle de formule cohérent avec le domaine abstrait utilisé.

On collecte ainsi pour chaque modèle de formule n-aire des n-uplets de cellules les vali-dant et constituant une fragmentation. Typiquement, on désignera les ensembles den-uplets de cellules de tableau par leursn-uplets d’indices qu’on abstraira dans le domaine des polyèdres convexes [CH78]. D’autres domaines abstraits peuvent être utilisés sous certaines conditions, et les auteurs présentent une abstraction permettant de désigner des morceaux d’un graphe d’ac-cessibilité pour des structures de données chaînées. Notons que ces abstractions permettent de désigner précisément des relations entre les indices des cellules validant les formules modèle. On peut par exemple désigner des couples de cellules (A[`1],A[`2]) dont les indices vérifient

`1≤`2, et ainsi instancier le modèle de formule cité plus tôt pour l’exemple des programmes de tris. Si on cible des propriétés sur des listes chaînées, on peut considérer les couples de maillons consécutifs.

Pour que l’analyse soit correcte, il faut que chaque ensemble de cellules dont on prétend qu’elles vérifient l’une des formules modèle soit effectivement une sous-approximation du véri-table ensemble. Ceci a des implications sur la manière de manipuler ces ensembles de cellules. Les domaines abstraits nous fournissent des sur-approximation de la borne supérieure, alors qu’ici on en voudra une sous approximation. Par exemple, si deux ensembles de cellules véri-fient la même formule modèle, on peut les regrouper en calculant la sous-approximation de leur union. Les auteurs proposent des algorithmes pour calculer ces sous-approximations ne s’ap-pliquant toutefois pas à tous les domaines abstraits et dont la complexité est très contraignante. Dans les treillis classiques, il n’y a pas en général, de meilleure sous-approximation et les algo-rithmes proposés ne donnent pas non plus des sous-approximations maximales.

Pour comparer avec TVLA [LARSW00], il s’agit toujours d’une fragmentation par prédicat : on regroupe les cellules vérifiant des prédicats choisis par l’utilisateur. Mais cette fois le prédicat estn-aire et est désigné par un modèle de formule. En contrepartie, au lieu d’avoir un fragment par prédicat, on a une fragmentation par prédicat. Si une cellule vérifie deux prédicats, elle sera désignée par les deux fragmentations. Mais on n’aura pas comme dans TVLA de fragment correspondant aux cellules vérifiant les deux prédicats à la fois. Ceci peut être résumé en disant qu’on n’a pas de partitionnement de l’ensemble des cellules.

D’autre part, ici, les prédicats ne servent qu’à choisir les propriétés observées tandis que dans TVLA les prédicats servent également à désigner les fragments. La forme des fragments est d’ailleurs plus générale et ne pourrait être obtenue simplement par une combinaison d’un ensemble fini de prédicats.

Comme TVLA, il s’agit d’une analyse semi-automatique car il faut effectivement choisir les modèles de formule. Par exemple, la formule a[α] ≤ b[β] est distincte de la formule a[α] ≤

b[β]+1. Nous sommes limités par le nombre de modèles que nous pouvons utiliser dans une analyse qui doit rester fini. On ne peut donc pas utiliser une famille de formules

{a[α]≤b[β]+i| i∈Z}

puisqu’il faudrait alors collecter pour chacune d’entre elles des ensembles de cellules différents. Ceci était notre remarque au début du chapitre 4.

En comparaison avec nos travaux, les fragmentations qu’il est possible de décrire sont plus générales. En contrepartie, ces fragmentations sont plus difficiles à manipuler, et il sera plus difficile d’en tirer des propriétés. Les auteurs ne donnent pas de méthode permettant dériver des propriétés générallement obtenues par réduction des valeurs abstraites. Par exemple, si on utilise le modèle de formule proposé plus tôt et que lors d’une analyse on trouve

∀`1≤`≤n⇒A[`]≤B[`] ∧∀`1≤`≤n⇒B[`]≤C[`]

on ne dérivera pas pour autant A[`1] ≤ C[`2]. Tandis qu’avec les méthodes [GRS05, HP08] précédemment citées ainsi qu’avec la méthode présentée dans cette thèse on y parviendra.

Ceci constitue la principale différence avec nos travaux. Pour le choix d’un domaine abstrait, nous sommes capables d’inférer toute une classe de propriétés sur les cellules, et d’en dériver d’autres grâce aux mécanismes de réduction dans les domaines abstraits. En outre, si l’expres-sivité de nos domaine de fragmentation est beaucoup plus réduite, aussi bien sur la forme des fragments que sur les relations sélectionnées entre ces fragments, nous avons la capacité de déduire des propriétés de la forme de la fragmentation.

Les ensembles de cellules collectées peuvent se chevaucher sans problème. Il n’y a pas de distinction systématique des cas d’alias mais l’analyse pourra déterminer des propriétés propres à certains cas d’alias. Lorsque une affectation modifie une cellule, on retirera la cellule de tous les fragments. Il sera alors parfois nécessaire de calculer une sous-approximation des fragments privés de cette cellule. De ce point de vue, l’approche est similaire à la notre : on autorise les fragments à se chevaucher quitte à prendre les précautions nécessaires pour l’interprétation de la sémantique.

Regrouper des cellules en fonction de leurs propriétés pose un important problème pour l’abs-traction de ces ensembles de cellules. Les absl’abs-tractions classiques sont généralement des en-sembles d’indices connexes. Supposons qu’on doive analyser le programme suivant :

Pouri de0à9faire

A[i] ← 0

Pouri de20à29faire

A[i] ← 0

On utilisera naturellement le modèle de formulea[α]=0. La méthode autorise qu’il y ait plu-sieurs ensembles de cellules pour le même module de formule. Mais pour assurer la terminaison de la méthode, ils imposent comme contrainte que le nombre d’ensembles de cellules soit borné par un paramètre de l’analyse. Or, si par malchance le nombre d’ensembles de cellules vérifiant

ce modèle de formule atteint déjà la limite, on sera forcé de fusionner ces ensembles de cellules pour ne pas violer la contrainte. Or les deux ensembles d’indices [0..9] et [20..29] sont disjoints et leur union n’est pas connexe. On sera donc forcé de l’approximer, et on pourra difficilement faire mieux que d’utiliser l’un ou l’autre comme sous-approximation de leur union.

Sur ce programme, notre méthode distinguera les deux ensembles correspondant à deux af-fectations distinctes et n’aura pas ce problème.

Pour finir sur ces travaux, nous pouvons revenir à l’un des exemples donnés dans la section 4.3 où l’on discute du choix de sous-approximation et de sur-approximation. Considérons un programme qui initialise les cellules d’indice pair à 0 et les cellules d’indice impaire à 1. Il serait vain de tenter de sous-approximer les ensembles de cellules d’indice pair et impair avec des abstractions d’ensembles d’indices connexes. Mais on peut choisir le modèle de formule 0 ≤ a[α] ≤ 1 et collecter sans problème les cellules le vérifiant. Cette dernière remarque nous permet de souligner le caractère semi-automatique de l’analyse et le fait que l’utilisateur devra sélectionner avec soin les modèles de formules choisis pour l’analyse.