• Aucun résultat trouvé

Le langage cible de notre analyse est un langage imp´eratif simple. La particularit´e de celui-ci est de traiter diff´eremment les canaux et les variables. Les programmes inter- agissent par le biais des canaux de communication. Des niveaux de s´ecurit´e sont associ´es a priori aux canaux plutˆot qu’aux variables du programme. Les niveaux de s´ecurit´e des variables changent en fonction du niveau de s´ecurit´e des informations qu’elles stockent. Notre analyse est sensible au flot. La propri´et´e de non-interf´erence assur´ee est d´efinie par rapport aux niveaux de s´ecurit´e des canaux.

3.2.1

Syntaxe

Soit Var, un ensemble d’identifiants de variables, C un ensemble de noms de canaux de communication. La notation suivante est utilis´ee de fa¸con g´en´erique : les variables sont x ∈ Var. Deux types de constantes existent : n ∈ N pour les constantes enti`eres et nch ∈ C pour les constantes canaux. La syntaxe se pr´esente comme suit :

(phrases) p ::= e | c

(expressions) e ::= x | n | nch | e1 op e2

(commandes) c ::= x := e |

skip |

if e then c1 else c2 end |

while e do c end | c1; c2 |

receivec x1 from x2 |

receiven x1 from x2 |

send x1 to x2

Les phrases sont soit des expressions soit des commandes. Les valeurs sont enti`eres ou des noms de canaux. Pour les valeurs bool´eennes, 0 repr´esente faux et toute autre valeur vrai. op repr´esente tout op´erateur arithm´etique ou de logique binaire sur des entiers ou op´erateur de comparaison de noms de canaux. Les commandes sont principalement les instructions standards des programmes imp´eratifs.

Nous supposons que deux programmes peuvent communiquer uniquement `a travers des canaux. Ces canaux peuvent ˆetre des fichiers, des canaux de r´eseaux, ou mˆeme des p´eriph´eriques d’entr´ee et de sortie (clavier, ´ecran d’ordinateur...) etc. Nous supposons que le programme a acc`es `a un pointeur indiquant le prochain ´el´ement `a lire sur le canal. Nous supposons aussi que l’envoi sur un canal concat´enera l’information `a celle qui ´etait d´ej`a pr´esente sur le canal afin que celle-ci soit lue dans un ordre premier-arriv´e-premier- sorti comme une file. Lorsqu’une information est lue sur un canal, elle n’est pas effac´ee. Seul le pointeur de lecture est mis `a jour, le contenu observable du canal demeure comme il ´etait avant cette lecture. Notre langage de programmation est s´equentiel ; nous n’essayons pas de traiter la concurrence de programmes de fa¸con synchrone. Nous consid´erons que tout processus autre qu’un processus entrain de s’ex´ecuter ne peut lire et ´ecrire que sur des canaux d´eclar´es publics. Il est n´ecessaire de s’attarder un peu plus sur la d´efinition des instructions de lecture et d’´ecriture :

– receivec x1 from x2 : elle signifie “recevoir contenu” et repr´esente une instruction

qui lit une valeur d’un canal dont le nom est x2 et qui assigne son contenu `a la variable

x1.

– receiven x1 from x2 : cette instruction signifie “recevoir nom”. Celle -ci au lieu de

recevoir n’importe quelle donn´ee du canal, est pr´evue exclusivement pour recevoir un nom de canal. La variable x1 qui re¸coit le nom de canal peut ˆetre utilis´ee par la suite

et doit ˆetre trait´ee comme un canal.

– send x1 to x2 : cette derni`ere est utilis´ee pour envoyer sur un canal de nom x2, le

contenu de la variable x1. Mentionnons que ce contenu peut ˆetre tout aussi bien une

valeur simple qu’un nom de canal.

La pr´esence de deux commandes receive diff´erentes est une cons´equence directe du choix qui a ´et´e fait de distinguer les variables des canaux. Cela sera mieux expliqu´e par la suite. Mais on peut d´ej`a noter que cela permet de recevoir un nom de canal priv´e sur un canal public mais pas l’inverse (pour ´eviter les flots implicites). L’information peut avoir un niveau de s´ecurit´e diff´erent de son origine.

3.2.2

S´emantique

Le comportement d’un programme suit la s´emantique op´erationnelle structurelle pr´e- sent´ee dans le tableau 3.1. Une instruction p est ex´ecut´ee `a partir d’une m´emoire µ : Var → N ∪ C , qui est une mappe associant aux identifiants des valeurs. Ainsi la s´eman- tique sp´ecifie comment une configuration hp, µi change soit pour devenir une valeur, une autre configuration, soit une m´emoire. Les ´evaluations d’expression `a partir d’une m´emoire ne g´en`erent pas d’effets de bord qui changeraient l’´etat de la m´emoire. Par contre, les commandes ont pour rˆole d’ˆetre ex´ecut´ees et de changer l’´etat de la m´emoire. Nous avons ainsi deux r`egles d’´evaluation : he, µi produit une valeur qui est le r´esultat de l’´evaluation de l’expression e `a partir de la m´emoire µ ; cette transition d´esign´ee par →e, hc, µi produit une m´emoire qui est le r´esultat de l’ex´ecution de la commande c sur

la m´emoire µ ; cette transition est d´esign´ee par →.

skip ne modifie pas l’´etat de la m´emoire. L’affectation x := e produit une m´emoire identique `a la m´emoire initiale µ, `a l’exception de la valeur de la variable x qui est maintenant le r´esultat de l’´evaluation de l’expression e.

receivecx1 from x2 et receivenx1 from x2 sont s´emantiquement ´evalu´ees de la mˆeme

fa¸con. L’information est lue du canal x2 et assign´ee `a la variable x1. La distinction

fondamentale entre les deux est que pour la r`egle RECEIVE-CONTENT, le r´esultat de l’´evaluation est une variable enti`ere ; tandis que pour la r`egle RECEIVE-NAME, le r´esultat en est un nom de canal. Dans la m´emoire µ, la valeur de la variable x1 est

donc modifi´ee. Dans le cas de RECEIVE-CONTENT, sa nouvelle valeur est la valeur enti`ere lue, tandis que dans celui de RECEIVE-NAME c’est le nom du canal lu. Nous introduisons ici, une fonction g´en´erique read(canal) qui repr´esente l’action d’obtenir de l’information d’un canal (par exemple une ligne `a partir d’un fichier, entr´ee d’un

clavier, donn´ees sur un canal r´eseau, etc.). Le contenu du canal demeure le mˆeme apr`es les deux types de lecture (“receive”).

send x1 to x2 met `a jour le canal x2 avec la valeur de la variable x1. Cela est fait par la

fonction g´en´erique update(canal, information), qui repr´esente l’action de mettre `a jour le canal avec une certaine information. Mentionnons que le contenu de la variable x2, qui

est le nom du canal n’est pas modifi´e ; ainsi la m´emoire µ ne subit pas de modification. Le contenu du canal est mis `a jour apr`es un send.

Une instruction conditionnelle if e then c1 else c2 end s’´evalue `a c1 ou c2 selon que e

s’´evalue `a vrai (toute valeur autre que z´ero) ou faux (z´ero) respectivement.

Pour la r`egle de la boucle (“loop”), si la condition bool´eenne s’´evalue `a faux, l’ex´ecution n’entre pas dans la boucle et la m´emoire n’est pas modifi´ee ; par contre si la condition s’´evalue `a vrai, le corps c est ex´ecut´e, suivi s´equentiellement par une r´eex´ecution de l’instruction while.

Si la commande c1 transforme la m´emoire µ en µ0, alors c1; c2 revient `a l’ex´ecution de

c2 sur µ0.