• Aucun résultat trouvé

Structure de la thèse

Dans le document Analyse des pointeurs pour le langage C (Page 34-39)

Dans le premier chapitre, consacré aux analyses clientes, nous montrons l’intérêt de conce- voir une analyse de pointeurs via des exemples d’analyses et d’optimisations. Les résultats de ces dernières sont significativement améliorés, quand l’information points-to permet de préciser les zones mémoire lues et écrites par les références.

Dans le deuxième chapitre, nous reprenons les principales analyses de pointeurs. Les ana- lyses se divisent en deux catégories selon leur sensibilité au flot de contrôle. Les analyses insen- sibles sont connues et utilisées grâce à leurs efficacité et complexité polynomiale, contrairement aux analyses sensibles au flot, connues pour la précision de leur résultat et leur complexité ex- ponentielle. Cette étude nous a permis de comparer les différents algorithmes et de nous en inspirer pour dépasser leurs limitations.

L’analyse points-to intraprocédurale du langage C est extrêmement complexe. Nous avons décomposé la présentation en utilisant successivement plusieurs sous-ensembles du langage, appelés L0, L1et L2de complexité croissante.

Ainsi le troisième chapitre décrit l’analyse intraprocédurale6 que nous avons conçue et qui reprend le principe de la sensibilité au flot de contrôle, comme l’analyse d’Emami [EGH94], tout en proposant un algorithme plus précis et général que cette dernière. Notre analyse est une ana- lyse descendante (appelée aussi « top-down »). L’information points-to de l’instruction en cours est calculée en fonction de l’instruction précédente. Dans ce chapitre, nous présentons les diffé- rentes équations utiles au calcul des arcs points-to et qui permettent de couvrir les instructions du langage L0et L1.

Dans le quatrième chapitre, nous décrivons l’analyse intraprocédurale étendue pour le lan- gage L2, c’est-à-dire qui prend en compte l’abstraction de la mémoire ainsi que les opérateurs

de comparaison. Ce chapitre comporte aussi les algorithmes de point fixe qui calculent les arcs

1.5. Structure de la thèse 9

points-to au niveau des boucles. La modélisation du tas ainsi que le traitement des structures de données récursives sont aussi abordés.

Le dernier chapitre décrit l’analyse interprocédurale qui prend en compte finement les appels de fonction. Notre analyse s’inspire du travail de Wilson [Wil97] qui propose une analyse insen- sible au contexte et qui se fonde sur les résumés calculés précédemment pour chaque fonction. L’analyse met à jour les sites d’appel sans recalculer les arcs points-to des appelés, quand c’est possible. En effet, contrairement à Wilson [WSR00], nous avons essayé de mettre clairement en évidence les difficultés de la traduction des sites d’appels et de décrire en détail les solutions retenues.

Notre analyse offre enfin l’avantage d’être développée dans PIPS qui est un compilateur source-à-source. Une fois notre analyse terminée, le programme peut être soumis directement à une autre analyse ou optimisation utilisant ses résultats. Notre analyse permet de fournir des résultats intraprocéduraux précis et une propagation interprocédurale locale efficace.

CHAPITRE

2

Les analyses clientes et les

objectifs pour le compilateur

P

our évaluer une analyse de pointeurs, la métrique la plus utilisée est la taille de l’ensembledes arcs points-to [HP00] [Rak01]. Plus cet ensemble est petit, plus l’analyse était jugée précise.

Cependant, cet ensemble peut être petit parce qu’il fait pointer tous les pointeurs vers la même zone mémoire, comme par exemple dans l’analyse d’Emami [Ema93], où tous les poin- teurs alloués dynamiquement via la fonction malloc pointent vers le même emplacement abstrait HEAP. Par conséquent cette métrique n’est pas suffisante pour juger de l’efficacité et surtout de la précision d’une analyse de pointeurs. C’est pour cette raison que les chercheurs [HP00] se sont tournés vers d’autres métriques plus significatives. Dans ce chapitre nous allons évaluer la précision de notre analyse, non pas avec des métriques de graphe, mais plutôt en se fondant sur des exemples qui illustrent l’impact des informations relatives aux pointeurs sur d’autres analyses, des optimisations et des transformations de code. Ces optimisations de code sont indépendantes de l’architecture et font donc partie de la partie intermédiaire du compilateur.

L’analyse points-to intervient au début de cette phase et ses résultats sont fournis comme entrée pour ces optimisations. L’impact de cette information nous fournit des informations sur la précision et surtout sur l’utilité de notre analyse points-to. Dans ce chapitre nous étudions l’impact de l’information points-to sur les analyses et optimisations suivantes :

1. le calcul des effets de lecture/écriture sur la mémoire ; 2. le calcul des use-def chains ;

3. la suppression du code inutile ; 4. le calcul des dépendances ; 5. la parallélisation ;

6. la suppression des expressions communes ; 7. et le renommage des scalaires.

2.1

La représentation des arcs points-to

Dans la littérature plusieurs représentations des arcs points-to ont été utilisées. Que ce soit sous la forme de couples d’alias1 <p,q> ou sous la forme de relation points-to <p->i>. Nous avons choisi d’utiliser la notation points-to avec une information en plus sur l’exactitude de l’arc. Les détails de la structure de données et de son affichage sont fournis dans les sections 2.1.1 et 2.1.2.

12 Chapitre 2. Les analyses clientes et les objectifs pour le compilateur

2.1.1

Structure de données

Un arc points-to relie une source, appelée aussi origine, une référence constante dont le type final est un pointeur, à un sink, qui représente un emplacement mémoire vers lequel pointe la source. L’emplacement mémoire est une référence constante correspondant à une adresse mémoire, si on la connaît. Sinon c’est un emplacement abstrait de la mémoire représentant un ensemble plus ou moins grand d’adresses. L’abstraction de la mémoire est détaillée à la section 5.3.1.

L’implémentation des structures de données est fondée sur l’outil NewGen [IJT91] qui permet la modélisation et la génération automatique de fonctions de manipulation (voir sous 7.1.1.3). points_to = source:cell x sink:cell x approximation x descriptor;

Prog 2.1 – Structure de données points-to

Pour l’analyse de pointeurs, le domaine cell qui représente une cellule mémoire, va se res- treindre à une référence. Le domaine reference dans PIPS [pip] est utilisé pour représenter une référence à un élément de tableau par exemple a[5]. C’est une variable avec un nom et une liste d’indices.

Les champs de structures, c’est-à-dire le type struct du langage C, sont représentés comme une concaténation du nom de la structure avec le caractère « . » et le nom du champ, par exemple un champ age d’une structure UnePersonne est noté UnePersonne.age. Le domaine cell va être aussi utilisé pour représenter des emplacements mémoire abstraits lorsque la case mémoire vers laquelle pointe le pointeur n’est pas une variable du programme (comme la valeur indéfi- nie ou le tas). Pour apporter plus de précision à l’arc points-to une approximation est attachée à chaque arc. Elle apporte une information sur le degré de certitude et sur la manière dont la source pointe vers la destination (« sink »), avec une approximation « MAY » ou « EXACT ». Les relations « MAY » sont générées entre autres par les structures de contrôle (union des points-to des branches « true » et « false »). Mais des incertitudes sur l’origine ou la destination d’un arc conduisent aussi à une approximation « MAY ». Elles sont le résultat de la traduction des déréfé- rencements de pointeurs ou d’évaluations d’indices en chemins d’accès mémoire constants. En effet, la traduction peut produire un ensemble de chemins dont la cardinalité est supérieure à un. Dans ce cas les arcs portent l’approximation « MAY ». Un autre cas générateur d’arcs « MAY » se présente quand la destination est un emplacement abstrait représentant plusieurs empla- cements réels comme les cellules allouées au niveau du tas. Le champ descriptor permet de définir des contraintes qui pourront éventuellement être utilisées par la suite pour traiter les arcs points-to impliquant des tableaux. Ce champ est ignoré par nos algorithmes et notre implantation. L’ensemble des emplacements mémoire, abstraits ou concrets, est modélisé sous la forme d’un treillis présenté dans le chapitre 5.

2.1.2

Affichage de la relation points-to

L’affichage des arcs points-to, au niveau du compilateur PIPS, est effectué sous forme de post-conditions données en commentaires au niveau du code source. Le code originel est dé- coré par les arcs points-to. Par exemple pour une instruction p = &i, qui a pour effet de faire pointer le pointeur p vers la case mémoire contenant la valeur de la variable i, le résultat est le suivant :

p = &i;

// Points To: // p -> i , EXACT

Dans le document Analyse des pointeurs pour le langage C (Page 34-39)