Mots clés : analyse statique,
lecture-écriture .
Participants : Jean-Philippe
Sautarel, Valérie Pascual, Frédéric Olier, Laurent
Hascoët.
L'analyse « lecture-écriture » est une analyse statique
très classique. Elle consiste, pour un fragment de programme
donné, à classer les variables de ce fragment en quatre
catégories:
- les variables dont la valeur en entrée du fragment est
seulement utilisée dans le fragment,
- les variables dont la valeur en entrée du fragment
n'est pas utilisée, mais est redéfinie dans le
fragment,
- les variables dont la valeur en entrée est utilisée
puis redéfinie,
- les variables qui ne sont ni utilisées, ni redéfinies
dans le fragment.
Cette analyse a un intérêt général, et devra être
effectuée systématiquement par ALI. Par
exemple en Différentiation Automatique, elle est utile pour
le checkpointing. Cette technique implémente un
compromis entre stockage et recalcul, et par conséquent peut
conduire à exécuter une même phase du calcul plusieurs fois.
Pour cela, il est nécessaire de mémoriser toutes les valeurs
nécessaires à cette phase. L'analyse « lecture-écriture »
permettra de déterminer statiquement un ensemble réduit de
variables dont la valeur doit être stockée.
Dans le cadre du stage de Jean-Philippe Sautarel, nous
avons implémenté cette analyse dans ALI. Nous
avons utilisé pour cela la machinerie interprocédurale
d'ALI. Il s'agit de la troisième utilisation
différente de cette machinerie, ce qui nous a conduit à
clarifier son API.
Comme toutes les analyses statiques, l'analyse «
lecture-écriture » rencontre ses difficultés principales
lorsque les variables sont des tableaux et lorsque le
contrôle dynamique (conditionnelles, boucles...) n'est pas
connu statiquement. Dans ce cas, on a très vite des
informations partielles (variable peut-être lue ou
écrite...). La combinaison de ces informations devient
délicate. De plus, ces informations sont calculées
itérativement sur le programme, jusqu'à atteindre un point
fixe, ce qui pose le problème de la terminaison. Nous avons
proposé un raffinement de la représentation de ces
informations pour lequel on peut prouver que les informations
calculées sont croissantes au cours des itérations, à
l'intérieur d'un ensemble fini, et donc qu'un point fixe est
nécessairement atteint en un temps fini.